2009-11-10 99 views
0

我想获得一个子视图成为firstResponder。我的理解是,这是在viewDidAppear方法中完成,像这样:但是如何做一个子视图firstResponder

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

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

​​

同时超控canBecomeFirstResponder返回YES:

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

}

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

为什么subview不会成为firstResponder?我怎么能让它firstResponder?

感谢,

mbotta

顺便说一句,这是我原来的问题的改写:

我想建立其中RootViewController的对象管理两个子视图,一个iPhone应用程序其中之一应该对用户摇晃他的iphone做出反应。

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

所以这里发生了什么:我实例化应用程序委托中的rootviewcontroller。在它的viewDidLoad方法中,我告诉它addSubView firstViewController。所有这些都很好用。

但是,firstViewController不会对任何抖动做出反应。我洒了一些NSLogs,发现虽然我们告诉firstBeanController在canBecomeFirstResponder中返回YES,而我们告诉它在viewDidAppear中[self becomeFirstResponder],实际上,它是而不是 firstResponder。

所以,我的问题是: 1)做一个子视图实际上需要firstResponder才能对抖动做出反应? a)如果没有,如何让一个子视图没有被firstResponder反应? 2)如何做一个subview firstResponder?

是什么让这个有趣的是,如果我执行相同的序列(canBecomeFirstResponder,[self firstResponder],motionBegan :)在一个不同的项目中只有一个视图控制器,它完美地工作。很明显,我必须遇到我自己制造的设计缺陷。

感谢,

mbotta

回答

1

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

Event Handling Best Practices(重点由我加的):

如果您在 的UIView,UIViewController的,或者(在极少数 例)UIResponder的子类处理事件,

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

如果你调用父类方法的事件很可能相处的nextResponder通过。上述

编辑

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

+0

谢谢!我会看看我可以在我的项目中做到这一点。同时,我会重新编辑我的问题,以澄清我能够得到这个事件,如果firstViewController是唯一的视图控制器。 – mbotta 2009-11-10 14:55:33