如何制作子视图firstResponder

时间:2009-11-10 14:30:15

标签: iphone cocoa-touch uikit

我想让子视图成为firstResponder。我的理解是这是在它的viewDidAppear方法中完成的,如下所示:

- (void)viewDidAppear {
    [self becomeFirstResponder];
}

在覆盖canBecomeFirstResponder时返回YES:

- (BOOL)canBecomeFirstResponder {
    return YES;
}

但是,当我在其父视图的viewDidLoad方法中插入子视图时:

- (void)viewDidLoad {
    subViewController = [[SubViewController alloc] init];
    [self.view insertSubview: subViewController.view atIndex: 0];
    [subViewController viewDidAppear: NO];
    [super viewDidLoad];

}

(我手动调用viewDidAppear,因为它不会自动触发),子视图不会成为firstResponder。

为什么子视图不会成为firstResponder?我怎么能把它作为第一个响应者?

感谢,

mbotta

不过,这是我原来问题的重写:

我正在尝试构建一个iphone应用程序,其中rootviewcontroller对象管理两个子视图,其中一个应该对用户摇动他的iPhone做出反应。

经过一番挖掘,我得出结论,子视图必须在其视图控制器的viewDidAppear方法中作出firstResponder。此外,应修改canBecomeFirstResponder方法以返回YES。

所以这里发生了什么:我在app delegate中实例化rootviewcontroller。在它的viewDidLoad方法中,我告诉它addSubView firstViewController。所有这一切都很美妙。

但是,firstViewController对任何震动都没有反应。我撒了一些NSLogs,发现虽然我们告诉canBecomeFirstResponder中的firstViewController返回YES,而我们在viewDidAppear中告诉它[self becomeFirstResponder],实际上它是不是 firstResponder。

所以,我的问题是: 1)子视图实际上需要是firstResponder才能对震动作出反应吗? a)如果没有,如何在没有firstResponder的情况下使子视图做出反应? 2)如何制作子视图firstResponder?

令人感兴趣的是,如果我在一个只有一个视图控制器的不同项目中执行相同的序列(canBecomeFirstResponder,[self firstResponder],motionBegan :),它们都可以完美地运行。显然,我必须遇到自己制作的设计缺陷。

感谢,

mbotta

1 个答案:

答案 0 :(得分:1)

不是100%肯定,但这可能是你的问题。如果我们能够看到有问题的方法,那就更容易了。

来自Event Handling Best Practices(我强调):

  

如果您处理子类中的事件   UIView,UIViewController或(很少见   案例)UIResponder,

     
      
  • 您应该实现所有事件处理方法(即使它是   一个null实现)。
  •   
  • 不要调用方法的超类实现。
  •   

如果调用超类方法,事件可能会传递给nextResponder

修改

上面的Event Handling Best Practices链接已经死了。我无法在任何地方找到拉引号,但Event Handling Guide for UIKit Apps似乎是最相关的。