如何在 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 开发中处理自定义事件?的主要内容,如果未能解决你的问题,请参考以下文章