iPhone UITableView触发父方法?

时间:2010-05-10 18:17:48

标签: iphone

好的,所以我正在开发一个带有偏好设置部分的iPhone应用程序,其中有一个基本的TableView,它有一个部分,以及几行自定义单元格,用于保存名称和值标签。单击一行会显示另一个视图,允许用户从列表中选择(另一个TableView),然后选择一个项目。

所有这些TableView都以编程方式完成。基础TableView有一个属性,它为每个“从列表中选择”视图保存一个Controller实例。每个“从列表中选择”视图都有一个名为chosenValue的属性,该属性具有当前选定的选项。我已经获得了UI来处理didSelectRowAtIndexPath以更新chosenValue属性,然后“pop”视图(返回主TableView)。但是,即使主TableView的cellForRowAtIndexPath方法引用属性中保存的子视图的chosenValue属性,视图也不会在选择项时更新。简而言之,子视图在“弹出”和卸载之后如何在父对象上触发reloadData

3 个答案:

答案 0 :(得分:2)

例如,您可以使用通知或委派来实现此目的。

使用通知,您的第一个视图控制器必须注册这样的通知:

…

[[NSNotificationCenter defaultCenter] addObserver:self  
                                         selector:@selector(methodToBeCalled:)  
                                             name:@"myNotification"  
                                           object:nil]; 

…

- (void)methodToBeCalled:(NSNotification *)notification { 
    [self.tableView reloadData];
    // do something else
}

然后您可以在第二个视图控制器中发出通知,如下所示:

[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil];

使用委托,您可以在第二个视图上为委托实现属性,在推送第二个视图控制器之前将其设置为self,并在需要时调用委托上的方法。

答案 1 :(得分:1)

您应该为此定义委托。 在子TableView中定义一个协议:

@protocol ChildViewControllerDelegate
- (void) somethingUpdated;
@end

还为实现此协议的委托定义属性:

id <ChildViewControllerDelegate> delegate;

然后在Parent中你需要做的就是定义一个someUpdated方法,将自己(parent)分配给Child中的delegate属性,并在需要更新时在Child视图中调用此方法。在Parent中更新的内容的实现可能会因您尝试完成的内容而有所不同。

答案 2 :(得分:0)

flohei非常感谢你发布这个!!我让它与NSNotificationCenter合作!我现在有一个子视图在父视图中调用方法!真棒。 @sha我也试过你的协议方式,但无法理解。也许一个更精细的描述会帮助像我这样的菜鸟。我一直在读你的协议方式是更好的原因,我想减少代码?所以我会继续学习它。谢谢你们俩!