Obj-C:我有`addTarget:action:forControlEvents`但是target没有响应选择器

时间:2013-01-06 03:50:24

标签: objective-c uiviewcontroller selector uigesturerecognizer uicontrol

我创建了一个类SYFactory,其中包含用于组合对象的各种类方法(主要是UIViewUIControl s)。这些类方法由UIViewController对象调用(或者更准确地说,由UIViewController子类的实例SYViewController调用。)

我正在尝试将选择器添加到UIControl创建的SYFactory对象中,并将目标设置为SYViewController的实例。

因此在SYFactory

+ (UIControl*)replyPaneWithWidthFromParent:(UIView*) parent selectorTarget:(id) target
{
//...
    [replyPane addTarget:target
                  action:@selector(showTheVideoPane:)
        forControlEvents:UIControlEventTouchUpInside];

    return replyPane;
}

UIViewController子类(称为SYViewController)中:

@interface SYViewController ()

@property (readonly, nonatomic) IBOutlet UIImageView *pane;
@property (strong, nonatomic) UIControl *videoPane;

//...
@end

@implementation SYViewController

@synthesize videoPane;
//...


- (void)viewDidLoad
{
    //...
    self.replyPane = [SYFactory replyPaneWithWidthFromParent:self.pane selectorTarget:self];
}

- (void)showTheVideoPane:(id) sender
{
NSLog(@"Selector selected!");
}
//...
@end

当我运行代码并尝试点击我创建的UIControl时,我收到unrecognized selector sent to instance错误。我不知道为什么,因为我在SYViewController中将+replyPaneWithWidthFromParent:parent selectorTarget:target对象作为参数传递。

由于某些奇怪的原因,UIControl对象认为该消息不应发送到SYViewController对象,而是尝试将其发送到不同类的对象。很奇怪,对吧?

有什么建议吗?

修改

所以,在发布问题后,我发现问题是什么(另一个证明写下来有助于思考它们的证据!):

SYViewController对象是在for循环内的局部变量中创建的。没有对该对象的进一步引用,一旦for循环终止,SYViewController对象被ARC销毁。

面对一个不存在的目标,UIControl对象试图在响应者链中找到一个它认为最有可能回复该消息的对象。该对象属于类SYFixedMarginView,因此出现错误消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[SYFixedMarginView showTheVideoPane:]: unrecognized selector sent to instance 0x1f877d60'

所以修复很简单。除了__strong循环中的局部变量之外,我还将视图控制器分配给for属性。

希望别人不会陷入同样的​​陷阱。

0 个答案:

没有答案