我有一个带有委托属性的UIView子类。在init方法中,我设置了
self.delegate = nil.
视图也有一个按钮,所以在init方法中,我还将按钮的目标设置为self.delegate,这是nil:
[myButton addTarget:self.delegate action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]
在设置我的UIView子类的UIViewController中,我调用UIView中的一个方法,该方法将UIView的self.delegate设置为UIViewController。当我单击按钮时,目标的变化似乎会被反映出来。
我想知道这最终是如何工作的,因为我的理解是addTarget:action:forControlEvents将id作为目标,而指针应该在Obj-C中传递值。因此,我很困惑为什么在调用addTarget方法之后更新了原来的零值指针。
答案 0 :(得分:0)
正确的方法是为您的视图声明一个协议,该协议将委托按钮的点按操作,即
YourView.h
@class YourView; @protocol YourViewDelegate @optional - (void)customView:(YourView *)view didSelectButton:(id)button; @end @interface YourView : UIView //... @property (weak, nonatomic) id <YourViewDelegate> delegate; @end
YourView.m
@interface YourView() @end @implementation - (id)init { if (self = [super init]) { //... [self setup]; } return self; } - (void)awakeFromNib { //... // setup logic when this view created from storyboard [self setup]; } - (void)setup { [myButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; } - (void)buttonTapped:(id)sender { if (self.delegate && [self.delegate respondsToSelector:@selector(customVIew:didSelectButton)] { [self.delegate customView:self didSelectButton:sender]; } } @end
然后,在您的视图控制器中实现YourViewDelegate类别:
@interface YourViewController() //... @end @implementation - (void)viewDidLoad { [super viewDidLoad]; //... self.yourView.delegate = self; } //... - (void)customView:(YourView *)view didSelectButton:(id)button { //do your stuff } @end
答案 1 :(得分:0)
Objective-C
使用Dynamic binding
。调用方法是在运行时而不是在编译时确定的。这就是为什么它也被称为后期绑定。
那么委托是什么以及调用哪个方法是在运行时定义的。