使用模态视图控制器添加到表视图

时间:2011-06-04 15:43:23

标签: iphone objective-c ios uitableview modalviewcontroller

在互联网上的每个地方,我都找到了如何通过使用带有绿色加号的特殊行“添加行”将行添加到表视图中的示例。但我不希望这样。

我想在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."); 
}

2 个答案:

答案 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当然必须是可公开访问的属性。

我相信你会找到第二个选择。

阅读Decorator pattern in Cocoa Fundamentals Guide

答案 1 :(得分:0)

解雇你的模态控制器之后:

[self addObjectToMyModel:newObject];

这样,如果你打电话给[tableView reloadData]它会显示,但你不需要打电话,而是:

您需要知道新对象在表中的显示位置,确定indexPath,并且:

NSIndexPath *indexPathOfInsertedCell = …;
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathOfInsertCell]
                    withRowAnimation:UITableViewRowAnimationFade];