我们正在使用一些自定义视图处理项目。我们有以下层次结构:
UIViewController - > UIScrollView(自定义子类) - > UIView(自定义子类)
我们正在呈现动态生成的按钮网格。当用户点击属于自定义滚动视图的其中一个UIView时,我们会触发一个如下所示的方法:
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
[[self superview] itemSelected:self];
}
在这种情况下,超级视图是我们的UIScrollView的自定义子类。从这里我们开始另一种方法:
- (void) itemSelected: (id)selectedItem {
itemView *item = selectedItem;
[[self superview] initSliderViewForItemNamed:item.name];
item = nil;
}
现在这里的事情已经破裂。我们想在UIViewController中触发另一个方法来在视图层次结构的顶部加载一个新视图。所以在UIViewController中我们有这个方法来测试成功:
- (void) initSliderViewForItemNamed:(NSString *)selectedItemName {
NSLog(@"Selected item was found! %@",selectedItemName);
}
但我们从未达到过这一点,应用程序崩溃了。这是因为我们不能在这里引用UIViewController。相反,我们引用了UIViewController的view属性。所以我们的实际对象层次结构是:
UIViewController.view - > UIScrollView(自定义子类) - > UIView(自定义子类)
这引出了两个问题。
答案 0 :(得分:0)
无法准确理解您想要达到的目标 - 您能描述最终目标吗? - 这种方法听起来非常复杂和复杂。我想我有一个解决方案,但不知道它是否相关:P
答案 1 :(得分:0)
Jim你应该在你的自定义uiview子类上设置一个委托,让你查看控制器是它的委托并符合你刚刚创建的协议,你会没事的(即:tableview正在做什么)
答案 2 :(得分:0)
是使用代表还是实现: -
或
取决于您想要如何处理触摸。
答案 3 :(得分:0)
我最终要做的就是将视图控制器指定为滚动视图的委托。它看起来像这样:
itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)];
[itemScrollView setDelegate:self];
[self.view addSubview: itemScrollView];
然后在我的ItemScrollView实现中,我可以参考ViewController:
[[self delegate] initSliderViewForItemNamed:selectedItem.name];
非常感谢所有回复的人。因此,将View Controller设置为委托是正确的答案,但是,没有人详细了解如何执行此操作。所以我在这个回复中已经涵盖了这一点。有关代表的问题也可以找到更多信息:
答案 4 :(得分:0)
执行所需操作的惯用方法是将消息发送到responder chain。 UIViewController参与响应者链,因此它将收到消息。