目标 C:我可以将子视图设置为 firstResponder 吗?
Posted
技术标签:
【中文标题】目标 C:我可以将子视图设置为 firstResponder 吗?【英文标题】:Objective C: Can I set a subview to be firstResponder? 【发布时间】:2011-06-08 04:40:15 【问题描述】:我有一种情况,我正在将另一个视图控制器的视图添加到现有的视图控制器。例如:
//set up loading page
self.myLoadingPage = [[LoadingPageViewController alloc]init ];
self.myLoadingPage.view.frame = self.view.bounds;
self.myLoadingPage.view.hidden = YES;
[self.view addSubview:self.myLoadingPage.view];
是否可以将“self.myLoadingPage”设置为第一响应者?在这种情况下,loadingpage 视图大小不会覆盖现有视图的整个大小,并且用户仍然可以与超级视图交互(这不是所需的行为)。在这种情况下,我只想启用子视图。
【问题讨论】:
【参考方案1】:当我遇到类似问题时,我制作了一个覆盖整个屏幕的不可见 UIView,我在主视图顶部添加了大的不可见 UIView,并使加载视图成为不可见 UIView 的子视图。
【讨论】:
【参考方案2】:最简单的解决方案是在加载视图中覆盖 hitTest 方法以返回 TRUE。这个顶部视图是响应者链中的第一个,调用 hitTest 方法,如果该点在视图内并因此将被处理,则该方法通常返回 TRUE,无论您获得触摸事件并有效阻止消息被重新发送到下一个响应者。
【讨论】:
【参考方案3】:有趣的问题。我找到了一个类似的post,并引用了苹果开发者论坛关于这个问题的引述:
真正让这个观点成为唯一的事情 在可以接收触摸的屏幕上 您需要添加另一个视图 最重要的是要赶上 其余的接触,或子类 a 查看层次结构中的某处(或 你的 UIWindow 本身)并覆盖 hitTest:withEvent: 总是返回 您的文本视图可见时,或 为不在你的触摸中返回 nil 文本视图。
这似乎表明没有一个非常简单的解决方案(除非在 2010 年 10 月之后对此进行了 API 更改。)
或者,我想您可以通过 superview
中的所有其他 subviews
并将它们的 userInteractionEnabled
属性单独设置为 NO
(但这可能会比引用的解决方案更麻烦)。
我希望看到其他方法来实现这一点。
【讨论】:
以上是关于目标 C:我可以将子视图设置为 firstResponder 吗?的主要内容,如果未能解决你的问题,请参考以下文章