【问题标题】:iPhone: Using a view controller to add items to a separate tableviewcontrolleriPhone:使用视图控制器将项目添加到单独的 tableviewcontroller
【发布时间】:2012-06-25 00:00:27
【问题描述】:

目前我有一个UITableViewController,它显示了该控制器实现文件 数组中的项目列表。现在,我想在右上角有一个按钮,当您按下它时,您会进入一个简单的页面,您可以在其中将项目添加到上一页的列表中。添加完项目后,它只会将您带回到列表中,现在列表中多了一个项目。

所以,我有一个 navigationController 引导到我的 tableViewController 和一个按钮,它“推动”你到添加项目页面。

如何访问对 tableViewController 的引用,以便调用我的 -(void)addNewItem:(NSString *) name; 方法?

【问题讨论】:

    标签: iphone uitableview parent-child


    【解决方案1】:

    以下是我如何做到这一点的基本概述。它对我有用,但我不确定这是不是最好的方法——其他人肯定会加入。

    “列表页面”(您的第一个 UITableViewController)实现了一个委托,“添加页面”调用该委托让“列表页面”知道要添加的项目的详细信息。

    当“列表页面”被带有上述详细信息的“添加页面”回调时,它会保存新项目,然后关闭“添加页面”。

    为了让这一切都连接起来,当“列表页面”创建并显示“添加页面”时,它会将self 传递给“添加页面”上的一个 ivar(我称之为delegate)。这基本上就是两者联系和交流的方式。

    这是我为委托定义的协议:

    @protocol AddItemViewControllerDelegate
    - (void)addItemViewController:(AddItemViewController *)controller 
                 withNewEventName:(NSString *)eventName;
    @end
    

    这是“列表页面”按钮点击处理程序:

    - (IBAction)addItem
    {
        AddItemViewController *controller = [[AddItemViewController alloc] initWithNibName:@"AddItemView" bundle:nil];
        controller.delegate = self;
        [self presentModalViewController:controller animated:YES];
        [controller release];
    }
    

    这是来自“添加页面”的提交代码:

    if ([self.delegate respondsToSelector:@selector(addItemViewController:withNewEventName:)]) {
        [self.delegate addItemViewController:self withNewEventName:eventNameTextField.text];
    }
    

    最后,这里是“列表页”中委托协议的实现:

    - (void)addItemViewController:(AddItemViewController *)controller 
                 withNewEventName:(NSString *)eventName 
    {
        EventModel *newEvent = [[EventModel alloc] init];
        newEvent.name = eventName;
        [eventsList addObject:newEvent];
        [newEvent release];
        [self saveEvents];
        [self dismissModalViewControllerAnimated:YES];
    }
    

    【讨论】:

    • 太棒了!感谢您的帮助,这正是我想要的。
    • 乐于助人。如果这解决了您的问题,请将其标记为答案。
    • 在尝试实现这一点时,我遇到了一些概念问题。协议是写在“列表”还是“添加”页面?
    • 列表页是实现协议的页。当您创建并显示“添加页面”时,您传递对“自我”的引用,以便您可以通过协议实现回调到“列表页面”实例。为简洁而道歉,我在游轮上只有一部电话和一个糟糕的网络连接。
    • 没问题,感谢您的帮助。我仍然遇到问题...当我使用 [self presentModalViewController:controller] 方法时,我收到一条错误消息:NSInternalInconsistencyException',原因:'无法在捆绑包中加载 NIB:'NSBundle'。知道这是什么吗?
    【解决方案2】:

    我遇到了同样的问题,而且必须将新项目添加到本地数据库中。您的问题是您的表格视图的数据源是什么?它是 coredata、SQLLite 还是只是一个项目数组?我在这里找到了单例类的解决方案是 tutorial 。不过,这将需要一些时间来实现单例类。

    如果您只想向表格视图添加文本,您可以使用 alertview。

    例如,如果您使用数组作为表格的数据源,您可以在每次按下您创建的按钮时添加一个带有警报视图的项目

    首先创建一个按钮,连接您的按钮以使用文件所有者在您的 .xib 文件中执行 IBAction

    -

    (IBAction)add:(UIButton *)sender
    {
    
        UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Item Name"
                                                         message:@"  "   
                                                        delegate:self 
                                               cancelButtonTitle:@"Cancel"
                                               otherButtonTitles:@"OK", nil];
    
        UITextField *nameField = [[UITextField alloc] 
                                  initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
        [nameField setBackgroundColor:[UIColor whiteColor]];
        nameField.text = @"";
        nameField.tag = 100;
        [dialog addSubview:nameField];
        [nameField release];
        [dialog show];
        [dialog release];
    
    }
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
        yourArraylist = [[NSMutableArray alloc] init];
    
    
        if([title isEqualToString:@"OK"])
        {
    
            UITextField* nameField = (UITextField *)[alertView viewWithTag:100];
            [yourArraylist addObject:nameField.text];
    
         // do additional  data source issues here 
        [self.mytableView reloadData];
    }
    

    【讨论】:

    • 谢谢!我将在表格中存储项目,所以 alertview 不适合,但我会看看那个教程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多