Iphone 如何在iOS开发中处理自定义事件?
我们正在使用一些自定义视图处理一个项目。我们有以下层次结构: UIViewController->UIScrollView(自定义子类)->UIView(自定义子类) 我们展示了一个动态生成的按钮网格。当用户点击属于自定义滚动视图的其中一个UIView时,我们将触发一个如下所示的方法:Iphone 如何在iOS开发中处理自定义事件?,iphone,objective-c,cocoa,delegates,uiviewcontroller,Iphone,Objective C,Cocoa,Delegates,Uiviewcontroller,我们正在使用一些自定义视图处理一个项目。我们有以下层次结构: UIViewController->UIScrollView(自定义子类)->UIView(自定义子类) 我们展示了一个动态生成的按钮网格。当用户点击属于自定义滚动视图的其中一个UIView时,我们将触发一个如下所示的方法: - (void)handleTapFrom:(UITapGestureRecognizer *)recognizer { [[self superview] itemSelected:self]; }
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
[[self superview] itemSelected:self];
}
itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)];
[itemScrollView setDelegate:self];
[self.view addSubview: itemScrollView];
本例中的super视图是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(自定义子类)
这就引出了两个问题
无法准确理解您想要实现的目标-您能描述一下最终目标吗?-这种方法听起来确实过于复杂和复杂。我想我有一个解决方案,但不知道它是否相关:P
难以准确理解您想要实现的目标-您能描述一下最终目标吗?-这种方法听起来确实过于复杂和复杂。我想我有一个解决方案,但不知道它是否相关:P
Jim你应该在自定义uiview子类上设置一个委托,让你的视图控制器成为它的委托,并遵守你刚才创建的协议,你会没事的(即:tableview正在做什么)
Jim您应该在自定义uiview子类上设置一个委托,让您查看控制器,使其成为委托,并遵守您刚刚创建的协议,这样您就会很好(即:tableview正在做什么)是的,可以使用委托,也可以实现:-- (无效)触摸开始:(NSSet*)触摸事件:(UIEvent*)事件
- (void)touchesend:(NSSet*)toucheevent:(UIEvent*)event
取决于您希望如何处理触摸。是的,可以使用代理,也可以实施:-
- (无效)触摸开始:(NSSet*)触摸事件:(UIEvent*)事件
- (void)touchesend:(NSSet*)toucheevent:(UIEvent*)event
取决于您希望如何处理触摸。我最终解决这个问题的方法是将视图控制器指定为滚动视图的代理。看起来是这样的:
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
[[self superview] itemSelected:self];
}
itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)];
[itemScrollView setDelegate:self];
[self.view addSubview: itemScrollView];
然后,在我的ItemScrollView实现中,我可以通过以下方式引用ViewController:
[[self delegate] initSliderViewForItemNamed:selectedItem.name];
非常感谢所有回复的人。因此,将视图控制器设置为代理是正确的答案,但是,没有人详细说明如何执行此操作。所以我在这里的回复中已经谈到了这一点。有关此问题的更多信息,请参见代表:
我最终解决这个问题的方法是将视图控制器指定为滚动视图的代理。看起来是这样的:
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
[[self superview] itemSelected:self];
}
itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)];
[itemScrollView setDelegate:self];
[self.view addSubview: itemScrollView];
然后,在我的ItemScrollView实现中,我可以通过以下方式引用ViewController:
[[self delegate] initSliderViewForItemNamed:selectedItem.name];
非常感谢所有回复的人。因此,将视图控制器设置为代理是正确的答案,但是,没有人详细说明如何执行此操作。所以我在这里的回复中已经谈到了这一点。有关此问题的更多信息,请参见代表:
做你想做的事情的惯用方法是将消息发送到服务器上。UIViewController参与响应器链,因此它将接收消息。执行所需操作的惯用方法是将消息向上发送。UIViewController参与响应程序链,因此它将接收消息。此组视图允许用户打开项目。我们希望在视图层次结构的顶部为选定对象实例化一个项目视图。当用户关闭一个项目时,他们将返回此视图。将假定我们的skype车队已修复它:d此视图集允许用户打开一个项目。我们希望在视图层次结构的顶部为选定对象实例化一个项目视图。当用户关闭一个项目时,他们将返回此视图。将假定我们的skype车队已修复它:D