父视图 - >子视图 - >按钮 - >子视图方法

时间:2010-08-31 17:54:41

标签: iphone objective-c xcode

我有一个带有ui视图的父视图。这会在viewdidload上加载一个subviewcontroller。子视图控制器上有一个按钮,它在内部触摸时链接到一个名为clicked的子视图控制器方法。

这会导致错误的访问错误触发并崩溃应用程序。我的问题是,这个设置是可行的还是我必须在父视图中使用该方法?子视图将加载到8个不同的父视图中,因此我希望将该方法保留在子视图中。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

这种设置的好方法是在包含按钮的视图中使用包含click消息,类型id的委托属性的协议,以及在同一视图中触发委托消息的方法,如[self]。代表点击]。 TouchUpInside事件链接到IB中的该方法,父视图将自身设置为子视图的委托,并使其自身符合协议。听起来有点棘手,但绝对是正确的做法。

议定书

@protocol viewWithButtonDelegate
  -(void)buttonClicked:(UIButton*)button inView:(UIView*)view;
@end
子视图界面中的

@interface viewWithButton {
...
id<viewWithButtonDelegate> delegate;
}
...
@property (nonatomic, retain) id<viewWithButtonDelegate> delegate
-(void)buttonClicked:(id)sender;
...
@end
子视图实现中的

-(void)buttonClicked:(id)sender {
  if([sender class] == [UIButton class]) {
    [self.delegate buttonClicked:(UIButton*)sender inView:self]
  }
}

控制器接口声明为

@interface myController<viewWithButtonDelegate>

最后在控制器实现中:

-(void)buttonClicked:(UIButton*)button inView:(UIView*)view {
  //do something in response to button clicked
}

希望这会有所帮助...