2010-07-15 36 views
2

我们正在使用一些自定义视图来处理项目。我们有以下层次:我如何处理iOS开发中的自定义事件?

的UIViewController - > UIScrollView中(自定义子类) - > UIView的(自定义子类)

我们呈现动态生成按钮的网格。当用户点击属于定制滚动视图的UIViews之一,我们火,看起来像这样的方法:

- (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的视图属性。因此,我们的实际对象层次是:

UIViewController.view - > UIScrollView中(自定义子类) - > UIView的(自定义子类)

这使我两个问题。

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

回答

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?

0

难以准确理解你想达到的目标 - 你能描述一下最终目标吗? - 这种方法听起来相当复杂和令人费解。我想我有一个解决方案,但不知道它是否相关:P

+0

这组视图允许用户打开一个项目。我们想为视图层次结构顶部的选定对象实例化一个项目视图。当用户关闭一个项目时,他们返回到这个视图。 – 2010-07-15 06:16:06

+0

会假设我们的skype convo固定它:D – 2010-07-15 06:24:51

0

Jim您应该在您的自定义uiview子类上设置一个委托,并让您查看控制器是否委托并符合您刚创建的协议以及您将被罚款(即:一个tableview中是做什么的)

0

星爷或者使用一个委托或您实现: -

  • (无效)的touchesBegan:(NSSet中*)触及withEvent:方法(的UIEvent *)事件

  • (无效)touchesEnded:(NSSet中*)触及withEvent:方法(*的UIEvent)事件

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

0

惯用的方式做你想要将发送消息了responder chain什么。 UIViewController参与响应者链,因此它会收到消息。