iPhone SDK: Customizing back button title

When developing navigation controller-based apps, it’s pretty common to want to customize the title of the back button that is displayed on the navigation bar. Usually the button title is set to the parent view controller’s title, but you can customize that.

All you need to do is add some code to the viewDidLoad method in the parent view controller:

- (void)viewDidLoad {
    [super viewDidLoad];
 
    self.title = @"Title goes here";
 
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    UIBarButtonItem *syncButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
    self.navigationItem.rightBarButtonItem = syncButton;
    [syncButton release];
 
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil];
    self.navigationItem.backBarButtonItem = backButton;
    [backButton release];
 
    [self refreshData];
}

Screenshots of the parent and child view controllers are available below:

iPhone SDK: Parsing semi-complex JSON objects

Since this seems to be quite common for newcomers to Objective-C / iPhone development, here’s another example on how to parse a semi-complex JSON object. This was asked as a comment on a previous post, but I think that deserves its own space.

The JSON object looks something like the following:

{"start":0,
 "stat":"ok",
 "locations":[{"name":"Pensacola, FL",
               "place_id":"qQ7Vig2bBZsZCy82",
               "woeid":2470377}],
 "count":3,
 "total":3,
 "query":"address=Pensacola"}

So you can quickly see that it’s an object, with a “locations” entry that contains an array of objects. This looks like an object that represents the search results for a location from some web service.

I will parse that complex object by creating separate variables to hold specific parts of the object, but there are simpler ways to do this. In this example, I want to get the value for the “name” key in the first item of the “locations” array.

// jsonString contains the actual JSON output from your web service
SBJSON *json = [[SBJSON alloc] init];
NSError *error = nil;
// object containing full results
NSDictionary *results = [json objectWithString:jsonString error:&error];
// array just for the "location" results
NSArray *locations = [results objectForKey:@"locations"];
// first location in your array
NSDictionary *firstLocation = [locations objectAtIndex:0];
// finally, the name key
NSString *name = [firstLocation objectForKey:@"name"];
[json release];

Rolando: incredible iPhone game

I don’t usually stop here to recommend applications or games for the iPhone, but I feel I need to take some time and do a review of Rolando, a game that had a lot of hype behind it for a few months, and it is now finally available on the App Store.

I have to give it to Simon Oliver, the guy behind this game. It’s an unbelievably well done game, starting with the beautiful (and playful) graphics and in-game story, all the way to the innovations in game control that allow for a great user interaction experience. The sound effects and music for the game are also top notch. I mean, I’m now at a point where I open the game and load a specific level of the game and just listen to the soundtrack.

This game is now the standard bearer for iPhone games, it’s just that good. The $9.99 price is completely deserved, and I recommend it to anyone.

Video trailers and screenshots are available from the Rolando website.

Book review: Beginning iPhone Development

I have been going through this book for the past few weeks, and so far it’s the best book around for developers beginning with Objective-C and the iPhone SDK. The writing is natural (and that’s hard to find these days), detailed and sometimes funny in a quirky way. I appreciate the fact that they use lots of screenshots to explain the interactions with Interface Builder and Xcode.

They have Chapter 3 (Handling Basic Interaction) available for free online if you would like to read a sample of the book. Highly recommended.

You may also like to follow Jeff LaMarche’s blog, one of the co-authors of this book.

iPhone SDK: Parsing JSON data

So when developing for the iPhone with the official SDK, and trying to parse JSON data, there are a few options for JSON libraries to use:

  • json-framework – General purpose JSON library for Objective-C, but contains a custom SDK that was built to be easily bundled with iPhone app projects.
  • TouchJSON – Part of the TouchCode, a project of a bunch of classes that are targetted for iPhone development, so it’s deemed to be a very light and fast library.
  • Maybe more? Let me know in the comments area.

Both are very under-documented (I mean, SERIOUSLY), but if you poke at them long enough, things will start making sense. I personally chose to use json-framework, as I initially had a few problems figuring out how to parse JSON content that had an array as the root object. Apparently TouchJSON officially only supports JSON results serialized as a object in the root level. As in:

{"values": ["value1", "value2", "value3"]}

Instead of:

["value1", "value2", "value3"]

That’s usually not a big deal, as you can just change the way you generate the JSON result in your server side code (if you are dealing with web services returning the JSON data), but what happens if you already have code expecting the server side to return that type of result?

Either way, I’m going to provide a simple usage example of json-framework to parse a JSON string. In order to install json-framework, you should follow the simple instructions available in its INSTALL file.

NSString *jsonString = @"[\"value1\", \"value2\", \"value3\"]";
SBJSON *json = [[SBJSON alloc] init];
NSError *error = nil;
NSArray *results = [json objectWithString:jsonString error:&error];
[json release];

For my particular application, I was fetching the JSON string from a web service, and it was coming up as a NSData object, so I had to do the following:

NSString *jsonString = [[NSString alloc] initWithData:resourceData encoding:NSUTF8StringEncoding];
SBJSON *json = [[SBJSON alloc] init];
NSError *error = nil;
NSArray *results = [json objectWithString:jsonString error:&error];
[json release];
[jsonString release];

Hopefully this is useful to someone else.

« Previous Page« Previous entries « Previous Page · Next Page » Next entries »Next Page »