知道我来自iOS背景并且这是我的第一个OS X项目之一可能会有所帮助。
在我的项目中,我有一个NSView子类和一个NSViewController,并在控制器中加载视图。
- (void)loadView
{
StartView *view = [StartView alloc] initWithFrame:frame]; // frame exists
self.view = view;
}
视图中有一个NSButton
- 属性btnNew
,我在initWithFrame:
中添加了该属性。
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.btnNew = [[NSButton alloc] initWithFrame:NSRectFromCGRect(CGRectMake(350, 180, 300, 60))];
[self addSubview:self.btnNew];
}
return self;
}
在loadView:
中,我尝试设置动作和目标。
- (void)loadView
{
StartView *view = [StartView alloc] initWithFrame:frame]; // frame exists
[view.btnNew setTarget:self];
[view.btnNew setAction:@selector(createNew:)];
self.view = view;
}
当然,createNew:
功能存在。
但是,单击该按钮时,应用程序崩溃。当我将setTarget:
和setAction:
移动到视图中并在self.btnNew
上执行时,它可以正常运行,但我认为这不是您应该如何处理体面MVC中的事件和用户交互-architecture。
我想问题是self
中的[view.btnNew setTarget:self];
。如果我使用view.btnNew.target
获取目标,则这是一个零对象(0x000 ... 000)。 Self
存在& view.btnNew
存在。
我做错了吗?或者我应该真的听取视图中的点击并使用代表或通知(我猜不是吗?)
答案 0 :(得分:2)
我自己在Niel Deckx的帮助下找到了它。
问题是 ARC 。在点击发生之前,ViewController被解除分配,这解释了 NSObject没有响应选择器:目标不再存在。
简单的解决方案是将ViewController作为(强大的?)属性创建它。