我想在MyTableViewController的标题栏中有一个加号按钮,并调用一些带有XIB文件的模态添加视图控制器,只有一个文本字段来填充它。在这个模态添加视图控制器中我想填写这个文本字段,在我按完成后,模态添加视图控制器解散,我想找到添加到MyTableViewController表视图的文本。
我的MyTableViewController中有一个属性来保存它的所有行:
@property (nonatomic, retain) NSMutableArray *list;;
我无法添加行来工作。我看不出我能做什么
[list addObject:];
当用户按下标题栏中的加号按钮时,我调用了MyTableViewController addItem方法的代码:
- (IBAction) addItem: (id) sender;
{
NSLog(@"Adding item...");
//Preparing "Add View" which has a single text field
AddViewController *addViewController = [[AddViewController alloc] init];
addViewController.title = @"Add Item";
UINavigationController *modalController = [[UINavigationController alloc]
initWithRootViewController:addViewController];
[addViewController release];
// Showing the prepared Add View controller modally
[self.navigationController presentModalViewController:modalController animated:YES]
NSLog(@"Modal controller has been presented.");
[modalController release];
}
以下是AddViewController中的代码,在输入文本字段并在标题栏中按Done后调用:
- (IBAction) done: (id) sender
{
NSLog(@"Reached Done");
if (textField != nil) {
self.fieldText = textField.text;
}
NSLog(@"About to dissmiss modal controller...");
[[self parentViewController] dismissModalViewControllerAnimated:YES];
NSLog(@"Modal controller has been dismissed.");
}
答案 0 :(得分:2)
为这样的Add Controller创建委托协议并使父控制器成为委托是很常见的。
当Add Controller被“完成”(即没有用可能的Cancel按钮取消)时,它会调用委托方法,比如说addControllerIsDone:
让父表视图控制器知道它应该取设定值,将其添加到列表中,并关闭添加控制器。
您还可以将列表传递给添加控制器,并让它在[parentViewController dismissModalViewControllerAnimated:YES]
调用之前添加设置值。
这取决于您是要在表视图控制器中保持对列表的控制,还是要将其传递给添加控制器。
在Add Controller被解除之后,您可以找出应该在tableView中添加新条目的单元格的位置并插入一个漂亮的动画,重新加载该部分(也可以是动画)或整个tableView(不是动画)可能的)。
@class AddViewController;
@protocol AddViewControllerDelegate <NSObject>
- (void)controllerIsDone:(AddViewController *)controller;
@end
@interface AddViewController : UIViewController
@property (nonatomic, assign) id<AddViewControllerDelegate> delegate;
@end
和'完成'代码
- (IBAction) done: (id) sender
{
......
[self.delegate controllerIsDone:self];
NSLog(@"About to dissmiss modal controller...");
[[self parentViewController] dismissModalViewControllerAnimated:YES];
NSLog(@"Modal controller has been dismissed.");
}
和MyViewController:
@interface MyViewController : UIViewController <AddViewControllerDelegate>
@end
因此必须实现controllerIsDone:
方法。像这样举例如:
- (void)controllerIsDone:(AddViewController *)controller
{
[self.list addObject:controller.textField.text];
}
当AddViewController自行解散时,MyViewController不必在委托方法中执行此操作。但好的做法是,如果你弹出模态视图控制器,你也应该忽略它,只是出于对称的考虑。 ;)
在这种情况下,textField当然必须是可公开访问的属性。
我相信你会找到第二个选择。
答案 1 :(得分:0)
解雇你的模态控制器之后:
[self addObjectToMyModel:newObject];
这样,如果你打电话给[tableView reloadData]
它会显示,但你不需要打电话,而是:
您需要知道新对象在表中的显示位置,确定indexPath,并且:
NSIndexPath *indexPathOfInsertedCell = …;
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathOfInsertCell]
withRowAnimation:UITableViewRowAnimationFade];