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.

Enterprise 2.0 und wie das mit meinem ADC-Beitritt zusammenhängt

Ab und an sollte man auch mal was Neues ausprobieren, und so bin ich gestern der Apple Developer Connection beigetreten. Eine kostenfreie Online-Mitgliedschaft zwar nur, aber für erste Schritte mit XCode und dem iPhone SDK wird es reichen. Ich bin sehr neugierig auf die Qualität der Frameworks, und war überrascht, wieviel Videomaterial und Dokumentation Apple einem zur Verfügung stellt. Ich habe schon viele Entwicklungsplattformen ausprobiert, aber hier fühlt man sich von Anfang an blendend betreut. Ich mag das:

adc2008

Wofür das Ganze? Ich denke derzeit darüber nach, ob das iPhone auch für Enterprise-ApplikationenSinn macht. Mir war dabei nicht klar, wie ich Anwendungen „auf den Firmenrahmen begrenzt“ auf Smartphones ausrollen kann. Klar, es gibt den iTunes AppStore um selbstentwickelte Programme auszurollen, aber ich denke nicht, dass ich über kurz oder lang ein eigenes Programm auf den freien Markt werfen will. Was Applikationen Im Firmen-Extranet angeht sieht es da schon wieder anders aus. Und hierfür möchte ich Smartphone und Netbookansätze unbedingt ausprobieren.

Ein anderer Gedanke: Auf dem Enterprise 2.0 Forum, dass ich diese Woche in Köln besucht habe, wurde mehrmals angesprochen, dass Computer und Smartphones immer mehr in das Privateigentum der Mitarbeiter übergehen werden. Das hätte etwas mit der Bequemlichkeit der Leute zu tun, die nicht 2-3 mal das selbe Gerät mitschleppen wollen. Firmen stellen ihre Arbeitsplattformen ohnehin mehr und mehr via Internet bzw. Extranet zur Verfügung, das individuell genutzte Gerät spielt damit immer weniger eine Rolle. Da Reisekosten immer mehr steigen, die Welt aber zeitgleich immer globaler wird, werden mehr und mehr Mitarbeiter ihre Arbeit „fern von der Firma“ erledigen. Da es darüber hinaus in Mode kommt, Zielerfüllung statt Stundenzahl zu honorieren, steigt die Anzahl der Jobs die ein einzelner Mensch ausführen wird. Sicher gilt das nicht für jedes Feld, aber ein Trend ist da.

Als abschließendes illustrierendes Beispiel haben wir gehört, dass Anfang des vorigen Jahrhunderts Mitarbeiter in Banken nur die Federkiele und Tinten der Bank nutzen durften, damit in den Büchern ein einheitliches Schriftbild herrschte. Davon ist ziemlich wenig übriggeblieben: Ich denke wir haben alle unsere eigenen Kugelschreiber inzwischen. Ich werde jedenfalls auf Weihnachtsgeschenke meiner Familie im Job nicht verzichten.