setAction:在NSViewController中

时间:2013-07-09 15:28:21

标签: objective-c cocoa

知道我来自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存在。

我做错了吗?或者我应该真的听取视图中的点击并使用代表或通知(我猜不是吗?)

1 个答案:

答案 0 :(得分:2)

我自己在Niel Deckx的帮助下找到了它。

问题是 ARC 。在点击发生之前,ViewController被解除分配,这解释了 NSObject没有响应选择器:目标不再存在。

简单的解决方案是将ViewController作为(强大的?)属性创建它。