Image Cache Probleme von XCode 4 in den Griff kriegen

Gestern hatte ich schon darüber berichtet, dass XCode 4 und sein integrierter Interface-Builder manchmal Probleme mit dem Anzeigen von Images in der IDE haben. Das Problem war temporär durch Verschieben oder Umbenennen des Projektverzeichnisses zu lösen, so daß ich fehlerhafte Cache-Strukturen vermutet.

Heute habe ich herausgekriegt wie das Problem entsteht und wie man es lösen kann. Zunächst einmal liegt es weder an korrupten Projektdateien noch an einem ausstehenden CLEAN auf das Projekt oder Target. Das ist sicher schon mal beruhigend: Es ist nichts kaputtgegangen.

Den wahren Übeltäter habe ich gefunden als ich in die Xcode Preferences geschaut und dort das Locations-Menü inspiziert habe. Hier gibt es Einträge für „derived data“, also „abgeleitete Daten“ wie Builds, Logs und Indexes.

xcode4imagecache01

Und diese „Derived-Data“-Ordnerstrukur ist die Problemquelle. Hier werden Resourcen, die im XCode-Quellverzeichnis liegen, für die IDE in gewandelter Form temporär gecached. Der Interface-Builder zieht in der IDE seine Images aus diesem Ordner, nicht direkt aus dem Quellverzeichnis.

Manchmal wenn man nun Bilddateien verschiebt oder neu in XCode in Gruppen anordnet verliert XCode den Zusammenhang zwischen Cache und Quelle. Genau das ist der Zeitpunkt ab dem Bilder im Interface-Builder nicht mehr angezeigt werden.

Ein CLEAN löst das Problem nicht da es nur die Compiler-Caches leert.

Ein Kopieren des Projekts in einen neuen Ordner legt auch einen neuen Derived-Data-Ordner an. Jedoch bleibt auch der alte Derived-Data-Ordner bestehen, so daß beim Zurückkopieren in den alten Originalordner das Problem wieder auftaucht.

Mit dem Organizer kann man die Derived-Data-Ordner einer Anwendung anzeigen:

xcode4imagecache02

Und exakt hier kann man diese Caches auch gefahrlos löschen. Danach sind alle Probleme mit dem Interfacebuilder beseitigt und die Bilder werden wieder korrekt angezeigt. Alternativ können die zugehörigen Ordner auch mittels Finder oder Terminal aus den angegebenen Pfaden gelöscht werden.

Falls InterfaceBuilder mal Images verschluckt

Sollte XCode mal Eure Images nicht mehr anzeigen in NIBs (obwohl sie im laufenden Programm oder im Simulator normal zu sehen sind):

  • Einfach Xcode schliessen,
  • den Projekt-Ordner auf den Desktop kopieren,
  • das Projekt aus dem kopierten Ordner öffnen.

Mysteriöserweise funktionieren die NIBs dann auch im Interfacebuilder wieder.

Das ganze scheint mir ein internes Caching-Problem des Interfacebuilders zu sein, und das egal ob in Version 3 oder 4. Ich denke das Problem tritt verstärkt dann auf wenn man das Projekt auf mehreren Rechnern in verschiedenen Ordnern bearbeitet und zwischen den beiden Maschinen ab und an hin- und herkopiert.

Das große UITextView-Rätsel

Eben durfte ich bei meiner Cocoa-Einarbeitung das große UITextView-Rätsel lösen.

Die Fragestellung dabei: Wie setzt man den Font einer UITextView-Control via InterfaceBuilder? 

Hintergrund des Problems: Jedes andere Control-Element zeigt ein Fontfeld im Inspector. Der UITextView nicht. Klar ginge es programmatisch, aber das wäre ja geschummelt. Es sollte schon beim interaktivem Editieren des Nibs möglich sein.

Die Lösung ist so einfach, dass man kaum darauf kommen kann: Man betätigt einfach CMD-T sobald das TextView-Element selektiert ist. So wie fast überall in OSX.

Warum aber ausgerechnet diese Control das Font-Attribut nicht auch im Inspector anbietet bleibt weiterhin ein Rätsel.

UDID eines iPhones via iTunes ermitteln

OS und der AppStore sind wie wir alle wissen ein geschlossener Garten. Eine Folge davon: Will man die Beta-Version einer Software an Tester oder Kunden ausliefern muss man für das Provisioning die Zielgeräte kennen. Für diesen Zweck hat jedes iPhone eine eindeutige UDID. Diese lässt sich sehr leicht via XCode und Organizer ermitteln, aber der Kunde oder Betatester hat nicht immer die komplette Entwicklungsumgebung installiert und im Zugriff. Glücklicherweise kann man die UDID aber auch über iTunes ermitteln.

Klicken wir in iTunes auf den Sidebar-Eintrag eines angeschlossenen iOS-Gerätes, zeigt es uns zunächst bereitwillig seine Seriennummer, nicht jedoch die für die Registrierung wichtige UDID:

udid01

Diese kann man aber an selber Stelle ermitteln indem man die angezeigte Seriennummer anklickt:

udid02

Auch die anderen Dialog-Felder zeigen auf Klick weitere Informationen, beispielsweise IMEI und Buildversion.