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

Posted

技术标签:

【中文标题】如何在 iOS 开发中处理自定义事件?【英文标题】:How can I handle custom events in iOS development? 【发布时间】:2010-07-15 05:42:07 【问题描述】:

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

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

这让我想到了两个问题。

    我们如何从属于控制器视图属性的子视图中引用 UIViewController? 此方法是否复杂。有一个更好的方法吗?我们是否应该将 UIViewController 分配为我们自定义的 UIScrollView 子类的委托?

【问题讨论】:

【参考方案1】:

无法准确理解您想要实现的目标 - 您能否描述一下最终目标? - 这种方法听起来确实过于复杂和令人费解。我想我有一个解决方案,但不知道它是否相关:P

【讨论】:

这组视图允许用户打开一个项目。我们希望在视图层次结构的顶部为选定对象实例化一个项目视图。当用户关闭项目时,他们会返回此视图。 假设我们的Skype convo修复了它:D【参考方案2】:

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

【讨论】:

【参考方案3】:

是的,要么使用委托,要么实现:-

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

取决于您希望如何处理触摸。

【讨论】:

【参考方案4】:

我最终解决这个问题的方法是将 View Controller 指定为滚动视图的委托。它看起来像这样:

    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?

【讨论】:

【参考方案5】:

做你想做的事的惯用方法是将消息发送到responder chain。 UIViewController 参与了响应者链,所以它会收到消息。

【讨论】:

以上是关于如何在 iOS 开发中处理自定义事件?的主要内容,如果未能解决你的问题,请参考以下文章

来自 iOS 锁屏的应用程序中的自定义远程事件处理

如何发出和处理自定义事件?

iOS 子视图、SRP 和自定义事件

webkit iOS 5上的自定义Javascript事件不起作用

java 自定义事件的触发及监听

如何在自定义原型方法中附加 socket.io 事件?