好的,所以我正在开发一个带有偏好设置部分的iPhone应用程序,其中有一个基本的TableView,它有一个部分,以及几行自定义单元格,用于保存名称和值标签。单击一行会显示另一个视图,允许用户从列表中选择(另一个TableView),然后选择一个项目。
所有这些TableView都以编程方式完成。基础TableView有一个属性,它为每个“从列表中选择”视图保存一个Controller实例。每个“从列表中选择”视图都有一个名为chosenValue
的属性,该属性具有当前选定的选项。我已经获得了UI来处理didSelectRowAtIndexPath
以更新chosenValue
属性,然后“pop
”视图(返回主TableView)。但是,即使主TableView的cellForRowAtIndexPath
方法引用属性中保存的子视图的chosenValue
属性,视图也不会在选择项时更新。简而言之,子视图在“弹出”和卸载之后如何在父对象上触发reloadData
?
答案 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我也试过你的协议方式,但无法理解。也许一个更精细的描述会帮助像我这样的菜鸟。我一直在读你的协议方式是更好的原因,我想减少代码?所以我会继续学习它。谢谢你们俩!