我创建了一个类SYFactory
,其中包含用于组合对象的各种类方法(主要是UIView
和UIControl
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
属性。
希望别人不会陷入同样的陷阱。