【问题标题】:How do I call a method in a ViewController class from one of its subviews?如何从其子视图之一调用 ViewController 类中的方法?
【发布时间】:2012-03-08 07:30:49
【问题描述】:

我想在不使用文本字段的情况下拉起键盘,因此我将 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];
}

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

【问题讨论】:

  • 只是我的猜测 [((MyViewController *)[[myToolBar superview] nextResponder]) update]
  • 我第一次误读了您的评论,并忽略了 nextResponder 电话。这成功地调用了更新方法,但是方法内部的操作没有被执行。我将更新我的问题以反映错误的真正来源。顺便谢谢你。

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


【解决方案1】:

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

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

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

【讨论】:

  • 返回并尝试anticyclop的方式后,我意识到发送的通知根本不是问题。这些方法曾经(并且正在)被调用。工具栏和视图控制器实际上可以正常通信。但是,表格视图既不响应帧调整,也不响应阵列的更新。附带说明一下,我不知道您可以对工具栏执行此操作,因为工具栏似乎没有 setDelegate 方法。感谢您的帮助——我总是很感激您的洞察力。
  • @SamHazleton 你说你继承了 UIToolbar,所以你可以很容易地自己添加一个委托。
  • @SamHazleton 在您的工具栏子类中声明一个delegate 属性并合成访问器(或不合成)。或者,使用您的工具栏委托应实现的方法声明声明一个协议。如果这样做,您可以将您的委托属性声明为采用该协议:@property(strong) id<MyProtocol> delegate;
【解决方案2】:

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

【讨论】:

  • 谢谢,我不知道我能做到这一点。实际上,考虑到我为此付出的大量工作,这个想法有点令人不安。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多