如何从其子视图中调用ViewController类中的方法?

时间:2012-03-07 01:38:43

标签: iphone objective-c model-view-controller nsnotificationcenter uikeyinput

我想在不使用文本字段的情况下拔出键盘,因此我将UIToolbar子类化并使其符合UIKeyInput协议。基于我使用简单NSLog打印输出的测试,我成功地读取了用户的键输入。我的问题是我需要键入键盘的文本来更新由与自定义工具栏相同的视图控制器管理的表视图。基本上我的问题是:如果我的更新方法在我的自定义工具栏类中,我如何告诉它更新表视图?或者,如果我的更新方法在我的视图控制器类中,如何确保每次按下某个键时都会调用它?

当我按下按键时,我试图让工具栏发送通知:

- (void)insertText:(NSString *)text {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"keyPressed" object:self];

然后用视图控制器

监听它
[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(updateForKeyPressed:) name:@"keyPressed" object:nil];

...

- (void)updateForKeyPressed:(NSNotification *)note {
   [self update];
}

这没有用,但这并不奇怪,因为我从在线文章中得到了这个想法,而且我相当肯定我做错了。在这一点上,我几乎都是按钮捣碎,如果有人能指出我正确的方向,那就太好了。一如既往,非常感谢任何帮助。如果有人想看到更多我的代码,请告诉我,我可以发布。

2 个答案:

答案 0 :(得分:2)

使用通知应该可以正常工作。你有什么调试代码的?您确定要发布通知吗?您确定视图控制器已在通知中心注册了吗?你确定-updateForKeyPressed:没有被调用吗?

委托是另一种可能更容易设置和调试的选项。让视图控制器将其自身设置为工具栏的委托,并让工具栏在其文本发生更改时向其委托发送消息,就像UITextView一样。

要记住的主要想法是您的视图不应该关心视图控制器。工具栏可能恰好向视图控制器发送消息,因为视图控制器恰好是其委托,但它不应该依赖于其委托是视图控制器的事实。

答案 1 :(得分:1)

您应该能够让视图控制器符合uikeyinput,然后将工具栏的委托设置为viewcontroller