views:

436

answers:

5

Using the Settings.app on the iPhone isn't that hard. In fact Xcode does the most of the work for you. Just add the Settings.bundle to your project and there you have it for nearly no cost.

At the moment I'm developing an application for the iPhone which requires the user to fill out several "forms", mostly key-value pairs, some sliders and several modal views with "dropdown" menus. So similar the task is similar to what the Settings.app does.

Doing the forms by myself is a heavy task in my opinion, so I'm wonding if there's a framework for this kind of tasks. Unfortunately it looks like Apple doesn't provide it's own solution. Perhaps somebody knows of a framework or an article on the web which describes best practices.

In case you don't understand to which pattern I'm referring, I made a screenshot: http://img.skitch.com/20090625-s8bf6ahybwe3cesd1id38h3nt.jpg

+1  A: 

Well if you are doing settings then I would suggest putting them in the correct place and using the Settings.bundle.

I guess you are doing settings though that are highly important to you app and it would be a horrible user experience if they had to keep jumping from the app to settings and back again.

When you say doing the task is heavy - can you elaborate - as I have done it and it has not been heavy.

Use a UITableViewController

for each cell that you want to use put in code similar to:

  cell.textLabel.text = @"Last name:";
  UIFont *labelFont = [UIFont systemFontOfSize:[UIFont labelFontSize]];
  CGSize textSize = [cell.textLabel.text sizeWithFont:labelFont];
  baseRect.origin.x = textSize.width+15;
  baseRect.origin.y +=7;
  baseRect.size.width = baseRect.size.width - textSize.width - 15;
  baseRect.size.height = 23;
  UITextField *textField = [[UITextField alloc] initWithFrame:baseRect];
  textField.keyboardType = UIKeyboardTypeAlphabet;
  textField.returnKeyType = UIReturnKeyDone;
  textField.clearButtonMode = UITextFieldViewModeWhileEditing;
  textField.delegate = self;
  textField.placeholder = @"last name";
  [textField addTarget:self action:@selector(lastNameChanged:) forControlEvents:UIControlEventAllEditingEvents];
  textField.tag = 182;
  [cell.contentView addSubview:textField]; 
  [textField release];

This has worked for me to reproduce the interface you are talking about - the example here is a TextField - but the same code has worked very well with all controls.

Grouchal
Aren't you reusing your UITableViewCells? If you do how can you distinct which of your textfields invoke lastNameChanged: ?
DASKAjA
Yes of course I am! - the tag on the textField tells me which field is which. Also I make sure any controls that match my list of tags are removed when the cell is recycled.
Grouchal
A: 

I am pretty sure what he is asking for is a framework that recreates the settings interface from the settings.bundle file so that there can be settings both in the settings app and within your app.

I don't yet know of anything like that but, I could really use one and I have considered writing one.

+2  A: 

It's better to put settings in the app, at least until Apple makes it easy to send the user out to Settings and then back into the app. If you look at the new 3.0 UITableViewCellStyles, there's one style tailor-made to doing settings kind of cells - it would make it pretty easy to build out a simple settings screen.

Kendall Helmstetter Gelner
+4  A: 

After much research I didn't manage to get a good answer to my initial question. But by now I stumbled over this repository on github: mySettings

DASKAjA
+2  A: 

Check out http://www.inappsettingskit.com. It's used in a couple of apps and it's actively maintained (by myself and a bunch of others).

Ortwin Gentz