对addTarget:action:forControlEvents的addTarget指针行为感到困惑:

时间:2014-06-22 06:14:26

标签: ios objective-c pointers uiview uicontrol

我有一个带有委托属性的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方法之后更新了原来的零值指针。

2 个答案:

答案 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。调用方法是在运行时而不是在编译时确定的。这就是为什么它也被称为后期绑定。

参考链接 - https://developer.apple.com/library/ios/documentation/general/conceptual/DevPedia-CocoaCore/DynamicBinding.html

那么委托是什么以及调用哪个方法是在运行时定义的。