【问题标题】:how does one make a subview firstResponder如何制作子视图 firstResponder
【发布时间】:2009-11-10 14:30:15
【问题描述】:

我正在尝试让一个子视图成为 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?我怎样才能使它成为firstResponder?

谢谢,

姆博塔

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

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

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

这就是发生的事情:我在应用程序委托中实例化了 rootviewcontroller。在它的 viewDidLoad 方法中,我告诉它 addSubView firstViewController。所有这些都非常漂亮。

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

所以,我的问题是: 1)子视图实际上是否需要成为 firstResponder 才能对晃动做出反应? a) 如果不是,如何让子视图在没有成为 firstResponder 的情况下做出反应? 2) 如何创建一个子视图 firstResponder?

有趣的是,如果我在一个不同的项目中只使用一个视图控制器执行相同的序列(canBecomeFirstResponder、[self firstResponder]、motionBegan:),那么一切都会完美无缺。显然,我一定遇到了我自己制造的设计缺陷。

谢谢,

姆博塔

【问题讨论】:

    标签: iphone cocoa-touch uikit


    【解决方案1】:

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

    来自Event Handling Best Practices(重点由我添加):

    如果你在一个子类中处理事件 UIView、UIViewController 或(很少见 例)UIResponder,

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

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

    编辑

    上面的Event Handling Best Practices 链接已失效。我在任何地方都找不到那个引语,但Event Handling Guide for UIKit Apps 似乎是最相关的。

    【讨论】:

    • 谢谢!我会看看我如何在我的项目中做到这一点。同时,我将重新编辑我的问题,以澄清如果 firstViewController 是唯一的视图控制器,我能够获得此事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多