我有一个带有ui视图的父视图。这会在viewdidload上加载一个subviewcontroller。子视图控制器上有一个按钮,它在内部触摸时链接到一个名为clicked的子视图控制器方法。
这会导致错误的访问错误触发并崩溃应用程序。我的问题是,这个设置是可行的还是我必须在父视图中使用该方法?子视图将加载到8个不同的父视图中,因此我希望将该方法保留在子视图中。
这样做的正确方法是什么?
答案 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
}
希望这会有所帮助...