我有一个包含许多子视图的视图,我希望父视图能够响应发生在其子视图中的事件,而无需大量手动中继来自子视图的事件。
具体来说,假设我希望在用户点击其任何子视图时通知父级,但也不干扰子视图的默认操作。例如,如果您点击 UITextView,我希望文本视图像往常一样成为第一响应者,我只想知道它。
我怎样才能做到这一点?
我有一个包含许多子视图的视图,我希望父视图能够响应发生在其子视图中的事件,而无需大量手动中继来自子视图的事件。
具体来说,假设我希望在用户点击其任何子视图时通知父级,但也不干扰子视图的默认操作。例如,如果您点击 UITextView,我希望文本视图像往常一样成为第一响应者,我只想知道它。
我怎样才能做到这一点?
不确定“没有大量手动中继事件”是否意味着“没有 NSNotificationCenter”,如果不是,您可以使用:
[[NSNotificationCenter defaultCenter] postNotificationName:@"subViewTouched" object:subView.tag];
// Where you set up tag as each subview's unique id
同样,不确定您是否要明确不使用NSNotificationCenter
.
绝对使用委托,或者将您的 UI 元素设置为公共属性并将事件连接到您的视图控制器中。委托是更好的途径。在我看来,NSNotificationCenter 很难调试并且容易出错。使用委托。
。H
@protocol MyViewDelegate;
@interface MyView : UIView
@property(weak, nonatomic) id<MyViewDelegate> delegate;
@end
@protocol MyViewDelegate <NSObject>
-(void)myViewButtonClicked:(MyView*)myView;
@end
.m
-(void)onButtonClick:(id)sender {
if(self.delegate) {
[self.delegate myViewButtonClicked:self];
}
}
在视图控制器中处理委托方法
-(void)myViewButtonClicked:(MyView*)myView {
//handle whatever
}