如何在iOS开发中处理自定义事件?

时间:2010-07-15 05:42:07

标签: iphone objective-c cocoa delegates uiviewcontroller

我们正在使用一些自定义视图处理项目。我们有以下层次结构:

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(自定义子类)

这引出了两个问题。

  1. 我们如何从属于控制器视图属性的子视图中引用UIViewController?
  2. 这种方法是否令人费解。有一个更好的方法吗?我们应该将UIViewController指定为UIScrollView的自定义子类的委托吗?

5 个答案:

答案 0 :(得分:0)

无法准确理解您想要达到的目标 - 您能描述最终目标吗? - 这种方法听起来非常复杂和复杂。我想我有一个解决方案,但不知道它是否相关:P

答案 1 :(得分:0)

Jim你应该在你的自定义uiview子类上设置一个委托,让你查看控制器是它的委托并符合你刚刚创建的协议,你会没事的(即:tableview正在做什么)

答案 2 :(得分:0)

是使用代表还是实现: -

  • (void)touchesBegan:(NSSet *)触及withEvent:(UIEvent *)事件

  • (void)touchesEnded:(NSSet *)触及withEvent:(UIEvent *)事件

取决于您想要如何处理触摸。

答案 3 :(得分:0)

我最终要做的就是将视图控制器指定为滚动视图的委托。它看起来像这样:

    itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)];
    [itemScrollView setDelegate:self];      
    [self.view addSubview: itemScrollView];

然后在我的ItemScrollView实现中,我可以参考ViewController:

    [[self delegate] initSliderViewForItemNamed:selectedItem.name];

非常感谢所有回复的人。因此,将View Controller设置为委托是正确的答案,但是,没有人详细了解如何执行此操作。所以我在这个回复中已经涵盖了这一点。有关代表的问题也可以找到更多信息:

How do I create delegates in Objective-C?

答案 4 :(得分:0)

执行所需操作的惯用方法是将消息发送到responder chain。 UIViewController参与响应者链,因此它将收到消息。