我想让子视图成为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
答案 0 :(得分:1)
不是100%肯定,但这可能是你的问题。如果我们能够看到有问题的方法,那就更容易了。
来自Event Handling Best Practices(我强调):
如果您处理子类中的事件 UIView,UIViewController或(很少见 案例)UIResponder,
- 您应该实现所有事件处理方法(即使它是 一个null实现)。
- 不要调用方法的超类实现。
如果调用超类方法,事件可能会传递给nextResponder
。
修改强>
上面的Event Handling Best Practices
链接已经死了。我无法在任何地方找到拉引号,但Event Handling Guide for UIKit Apps似乎是最相关的。