了解我来自 iOS 背景并且这是我的第一个 OS X 项目之一可能会有所帮助。
在我的项目中,我有一个 NSView 子类和一个 NSViewController 并在 Controller 中加载 View 。
- (void)loadView
{
StartView *view = [StartView alloc] initWithFrame:frame]; // frame exists
self.view = 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:
移动到 View 中并在 self.btnNew
上执行它们时,它可以工作,但我认为这不是您应该如何在良好的 MVC 架构中处理事件和用户交互。
我猜问题出在 [view.btnNew setTarget:self];
中的 self
。如果我使用 view.btnNew.target 获取目标,则这是一个 nil 对象 (0x000…000)。 Self
存在且 view.btnNew
存在。
我做错了什么吗?或者我应该真正监听 View 中的点击并使用委托(delegate)或通知(我想不是?)
最佳答案
在 Niel Deckx 的帮助下我自己发现了这一点.
问题是ARC。 ViewController 在点击发生之前被释放,这解释了 NSObject 不响应选择器:目标不再存在。
简单的解决方案是将 ViewController 作为创建它的(强?)属性。
关于objective-c - 设置 Action : in NSViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552205/