Storyboards in Xcode

Recently I have used storyboards to build an App.net client. After many hours with it I have to say, I won’t use storyboard in future project unless Apple improves it tremendously.

Complexity

One of the main problems I have with the storyboard of this rather simple app can be summarized in one picture.

The storyboard of hAppy, my App.net client.

The storyboard is very complex and there is a lot of repeated information. The app has several tabs holding similar views. I did not accomplish to use the same view in storyboard for these views. The problem is, that these different but similar views have different view controller which are embedded in navigation controllers. The navigation controllers themselfes are hosted in a tab bar controller.

I am not saying it is not possible to reuse one view, but all my attempts did not solve the problem. So if it is possible it is to complicated for me.

Repeated information in software development is a problem. During the development of hAppy I had to change the views a lot and this led to changing the same part of the user interface in different parts of the storyboard. Without the use of storyboards I just would have changed a few lines of code for all views at once.

Missing Method Parameter

A lot of the segues I use in hAppy push another view onto the navigation stack when the user touches an action button beneath a post cell. Let’s say the user touches the profile button to show the profile of the user who posted the status. The first thing is to find the indexPath of the cell which contains the post.

CGPoint buttonOrigin = [self.tableView convertPoint:sender.frame.origin fromView:sender.superview];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonOrigin];

Then I call a method to get the dictionary for the post and extract the user from this dictionary.

NSDictionary *postDictionay = [self postDictionaryForControlCellIndexPath:indexPath];
NSDictionary *userDict = [postDictionay objectForKey:@"user"];

And now it becomes ugly. I want to push the profile view onto the navigation stack with the profile of the user I just found. The pushing is done by calling performSegueWithIdentifier:sender:. But who is the sender in this case? Normally you would think the sender is the button which was touched. But then the code to find the user should have been in the performSegueWithIdentifier:sender: method. Fair enough. But in hAppy you can also get to the profile by touching the avatar in the post. In this case the sender would be different and I would need two segues to the profile view. Which again is repeated information.
To solve this I call performSegueWithIdentifier:sender: with the user id (which is a string) as the sender.

[self performSegueWithIdentifier:@"ShowProfile" sender:[userDict objectForKey:@"id"]];

Doing so I can use one segue for one transition between the post view and the profile view.

Yes, I know what you think. This is awful and inconsistent. But the other possibilities I can think of are worse. I my opinion Apple could fix this with a method like performSegueWithIdentifier:sender:userInfo: with userInfo being of type NSDictionary. Then one could give the actual segue preparation additional information for the view to be shown.

Follow me on App.net.

Flattr this

Posted in Development | Tagged | Comments Off on Storyboards in Xcode

Tabs in Xcode

I love the tabs in Xcode and here is why.

Each tab in my configuration of Xcode is for a different task.
The first tab is the Main tab. In this tab I do all the coding. Sure I could use more than one tab for the coding but I don’t.

The second tab is for the logging during compilation. Therefore I have set a behavior to switch to this tab when compilation starts and to show the log.

The third tab is for debugging. There is also a behavior to show the debugging tab when the run starts.

When the run completes Xcode should return to the Main tab. This can be accomplished with another behavior.

The last tab is for Interface Builder. To show only the files important for Interface Builder one can set a filter at the bottom of the project navigator.


Flattr this

Posted in Development, Uncategorized | Tagged , , | Comments Off on Tabs in Xcode

Following and Followers View in hAppy

20120930-010523.jpg

Posted in iPhone | Tagged , , | Comments Off on Following and Followers View in hAppy

hAppy, my App.net client

20120821-094336.jpg

20120821-094344.jpg

20120821-094353.jpg

20120821-095655.jpg

20120921-131826.jpg

20120921-131836.jpg

20120921-131849.jpg

Posted in iPhone | Tagged , | Comments Off on hAppy, my App.net client

iPhone-Akku-Tests

Angeregt durch die bitsundso #285 habe ich die Akkulaufzeit des iPhone 4 mit angeschaltetem, ungekoppelten Bluetooth mit der mit ausgeschaltetem Bluetooth verglichen.

Zunächst die Parameter:

  • Hintergrundbeleuchtung maximal
  • WiFi an
  • 3G an
  • Automatische Bildschirmsperre aus
  • iOS 5.1
  • iPhone 4 (Ende 2010)
  • Das iPhone wurde während dem Test nicht benutzt.
  • Automatischer Mailabruf und Mail-Push deaktiviert

Die Messung wurde mit der von mir entwickelten App YourBattery durchgeführt. Das iPhone wurde vor den beiden Testdurchläufen vollgeladen. Die Akkulaufzeit wurde anhand Dauer der Entladung von 100% auf 80% hochgerechnet.

Das Ergebnis:
Screenshots der Messung:


Wie man auf den Screenshots erkennen kann ist die Akkulaufzeit mit Bluetooth 6:44h und ohne 6:58h. Umgerechnet in Minuten sind das 404 min und 418 min. Das bedeutet, dass der Akku mit eingeschaltetem, ungekoppeltem Bluetooth 3,3% kürzer hält.

Probleme der Messung:

  1. Wie man auf den Screenshots erkennen kann stimmt die Akkuladung, die das Programm auslesen kann (anhand von [[UIDevice currentDevice] batteryLevel]) nicht mit der Akkuladung überein, die das iPhone rechts oben anzeigt. Warum das so ist, weiß ich nicht. Da diese Abweichung bei beiden Messungen auftrat, schätze ich den Einfluss auf das Ergebnis gering ein.
  2. Das iPhone wurde nur vor dem ersten Testdurchlauf (dem mit eingeschaltetem Bluetooth) neu gestartet.
  3. Das iPhone befand sich im WiFi und im Mobilfunknetz. Um die Akkulaufzeiten vergleichen zu können muss man davon ausgehen, dass die Zustände der WiFi- und des Mobilfunknetzes in den Messzeiträumen vergleichbar sind.
  4. Das iPhone wurde jeweils vom Strom getrennt, nachdem rechts oben 100% angezeigt wurden. Allerdings ist bekannt, dass das iPhone in der Regel danach noch weiter lädt.
  5. So wirklich aussagekräftig ist dieser Vergleich natürlich nicht, da pro Einstellung nur jeweils eine Messung durchgeführt wurde. Wenn ich Zeit finde werde ich diese Messungen wiederholen.
Posted in iPhone | Tagged | Comments Off on iPhone-Akku-Tests

Der UiNavigationController hat eine Toolbar

Heute habe ich gelernt, dass die Cocoa-Touch Klasse UINavigationController eine eingebaute Toolbar hat.

Ich stand vor folgendem Problem: Ich wollte die Navigation der App durch ein UiNavigationController bewerkstelligen und dabei ein Element am unteren Bildschirmrand haben, dass weitere Navigationselemente zur Verfügung stellt. Ein UITabBarController kam nicht in Frage, da ich mehr Kontrolle über das Aussehen brauche.

Die nächste Idee war, UITabBarController zu subclassen und das Aussehen selbst zu definieren. Das wäre aber zu viel Kontrolle gewesen. Außerdem hätte ich mich dann auch mit allerlei Seiteneffekten herumschlagen müssen.

Meine nächste Idee wäre gewesen ein UIToolbar einzubinden. Allerdings hätte ich das in jedem View Controller einbinden müssen.

Schlussendlich brachte mich eine Folge der Stanford iTunes U Vorlesung auf die richtige Lösung:

Wenn man dem UINavigationController die Nachricht setToolbarHidden:animated: schickt kann man die Toolbar des UINavigationControllers einblenden. In jedem View Controller der dann auf den Navigation Stack geschoben wird kann man die Toolbar Elemente mit setToolbarItems: definieren.

Posted in iOS-Entwicklung | Tagged , | Comments Off on Der UiNavigationController hat eine Toolbar

UIPopoverController sollte ein Property sein

Heute habe ich gelernt, dass eine Instanz von UIPopoverController als Property (mit Attribut strong) der Klasse, in der das Popover präsentiert wird, definiert werden sollte. Ansonsten deallokiert (unter ARC) die Runtime das Popover bevor es präsentiert wird.

Posted in iOS-Entwicklung | Tagged , , | Comments Off on UIPopoverController sollte ein Property sein

Xcode, mein Name ist…

Heute habe ich durch einen iTunes-U-Podcast gelernt, wie man Xcode mitteilt, wie man heißt und wo man arbeitet. Hat man das getan, werden diese Informationen in jede Datei, die man mit Xcode erzeugt als Kommentar eingefügt.

Dazu öffnet man die Adressbuch-Applikation und erzeugt einen Eintrag mit dem Namen und der Firma in der man arbeitet. Dann klickt man unter “Card” auf “Make This My Card”. Die hinterlegten Informationen werden ab dem Zeitpunkt in jede Datei, die man mit Xcode erzeugt als Kommentar eingetragen.

Posted in iOS-Entwicklung | Tagged , | Comments Off on Xcode, mein Name ist…

Vegane Weihnachtsbäckerei

Gerade noch rechtzeitig präsentieren wir Euch die erste vegane Weihnachtsbäckerei-App der Welt. Kaufen, kaufen, kaufen!

Posted in iOS-Entwicklung | Tagged , | Comments Off on Vegane Weihnachtsbäckerei

Teile einer Datei ausgeben

Mit dem Befehl cut kann man im Terminal Spalten aus einer Datei extrahieren.

Posted in Mac Tips | Tagged , | Comments Off on Teile einer Datei ausgeben