2

我创建了一个视图控制器,它显示一个用于将视图滑动到屏幕上的按钮。这个想法是在屏幕上放置三个这样的视图控制器,从而在屏幕底部提供三个按钮来提供导航。

视图控制器堆叠在一起,因此顶部的视图控制器现在覆盖了其他视图,因此也覆盖了其他按钮。只有顶部视图控制器的按钮在这种情况下工作,我希望它们三个都是可点击的。我尝试在视图上禁用用户交互并仅在按钮上启用它,但看起来超级视图设置推翻了子视图设置。

有任何想法吗?

4

2 回答 2

1

您似乎混淆了视图及其控制器:viewController 没有堆叠,它们只是 nib 或 xib 文件的一部分。另一方面,视图可能是视图层次结构的一部分,并且在这个意义上可以相互重叠。viewController 的功能是管理和协调屏幕上的各种视图。使用视图控制器管理单个按钮效率不高:控制器的目的是促进各种按钮之间的通信(例如,当触摸数字 3 时禁用按钮 1,2 和 4)。@bpapa 关于 Apple 不鼓励使用多个 viewController 的说法不再正确。iOs 应用程序编程指南中的当前窗口、视图和视图控制器部分指出:

视图控制器直接管理单个顶级视图,并且可以管理该视图的全部或部分子视图。对于简单的用户界面,视图控制器通常管理其视图层次结构中的所有视图。然而,对于由几个不同部分组成的更复杂的接口,视图控制器可以管理视图子集并依赖一个或多个自定义控制器对象来管理视图层次结构中的其他视图组。

文档中没有明确说明但在过去几周让我数次困扰的一件事是,只有当 viewController 是 nib 的文件所有者时,才会使 viewController 成为 UIControl 操作的目标。例如,假设您有一个带有两个视图控制器的 nib,gameViewController 和 scoreViewController。gameView 可能包含几个充当游戏片段的按钮,触摸它们会向 gameViewController 的 -(void)pieceHasBeenTouched:(id)sender 方法发送操作消息。如果 gameViewController 是文件的所有者,这将非常有用。

现在看来,如果您在 scoreView 中有一个按钮,可以让它向 scoreViewController 发送消息,例如 saveScore 或类似的东西,这似乎是合乎逻辑的。由于我还不太清楚的原因,响应者链不会让你。您需要让得分视图中的“保存”按钮将其操作消息发送到 gameViewController。

我通过在两个控制器之间建立 IBOutlet 绑定来解决这个问题——通知是另一种可能性。

于 2010-08-10T19:17:10.160 回答
0

将此添加到您的代码到您的装扮中UIViewhitTest:withEvent:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hittedView = [super hitTest:point withEvent:event];
    return hittedView == self.button ? hittedView : nil;
}

我参考了这个:UserInteraction enable for subview only。我已经测试了代码。它有效!

于 2012-11-19T10:44:02.950 回答