テーブルビューを使用してiPhoneアプリケーションで動的フォームをレンダリングする必要があります。このフォームには、ボタン、テキストフィールド、ラベル、ピッカー、日付ピッカーなどの複数のUIコントロールが含まれる場合があります。
動的フォームをレンダリングできるiPad用のサンプルコードを1つ入手しましたが、このサンプルコードは、iPhoneアプリケーションでサポートされていないUIPopoverControllerを使用しています。だから私はiPhoneで動作するはずのサンプルコードを探しています。
以下は、動的な形式でボタンをクリックしたときにコンボボックスを表示するコードです。リストアイテムとともにピッカーを表示するコードが必要です。
サンプルコード:https ://github.com/ecrichlow/iPad-Dynamic-Table-Cells
- (IBAction)buttonPressed:(id)sender
{
[delegate rowItemWasSelected:self];
if (self.itemControlType == ControlTypeToggleButton)
{
...
}
else if (self.itemControlType == ControlTypePopup)
{
...
}
else if (self.itemControlType == ControlTypeCombo)
{
UITableViewController *popoverTable = [[[UITableViewController alloc] initWithStyle:UITableViewStylePlain] autorelease];
UIToolbar *toolbar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, DEFAULT_POPOVER_WIDTH, DEFAULT_TOOLBAR_HEIGHT)] autorelease];
UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, DEFAULT_POPOVER_WIDTH, ([self.controlSelections count] * popoverTable.tableView.rowHeight) + DEFAULT_TOOLBAR_HEIGHT)] autorelease];
UIViewController *containerViewController = [[[UIViewController alloc] init] autorelease];
UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:containerViewController];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(DEFAULT_COMBO_TEXTFIELD_MARGIN, (DEFAULT_TOOLBAR_HEIGHT - DEFAULT_COMBO_TEXTFIELD_HEIGHT) / 2, DEFAULT_POPOVER_WIDTH - (DEFAULT_COMBO_TEXTFIELD_MARGIN * 2), DEFAULT_COMBO_TEXTFIELD_HEIGHT)];
textField.delegate = self;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
textField.font = [UIFont systemFontOfSize:DEFAULT_COMBO_FONT_SIZE];
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[textField addTarget:self action:@selector(fieldTextDidUpdate:) forControlEvents:UIControlEventEditingDidEnd];
containerViewController.view = containerView;
popoverTable.tableView.dataSource = self;
popoverTable.tableView.delegate = self;
popoverTable.tableView.frame = CGRectMake(0, DEFAULT_TOOLBAR_HEIGHT, DEFAULT_POPOVER_WIDTH, [self.controlSelections count] * popoverTable.tableView.rowHeight);
popoverController.popoverContentSize = CGSizeMake(DEFAULT_POPOVER_WIDTH, ([self.controlSelections count] * popoverTable.tableView.rowHeight) + DEFAULT_TOOLBAR_HEIGHT);
popoverController.delegate = self;
[toolbar addSubview:textField];
[containerView addSubview:toolbar];
[containerView addSubview:popoverTable.tableView];
optionPopoverController = popoverController;
[popoverController presentPopoverFromRect:control.frame inView:control.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
// If there's currently an object that's first responder, make it resign that status
for (UIView *subview in self.control.superview.subviews)
{
if ([subview isKindOfClass:[UITextField class]])
{
if ([subview isFirstResponder])
{
[subview resignFirstResponder];
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
}
}
[textField becomeFirstResponder];
}
else if (self.itemControlType == ControlTypeButton)
{
// Don't need to do anything here. Caller passed in target and action. But in order to trigger delegate rowItemWasSelected this control type was added here.
}
}