2

知道我来自 iOS 背景并且这是我的第一个 OS X 项目可能会有所帮助。

在我的项目中,我有一个 NSView 子类和一个 NSViewController 并在控制器中加载视图。

- (void)loadView
{
    StartView *view = [StartView alloc] initWithFrame:frame]; // frame exists
    self.view = view;
}

该视图具有我添加的NSButton- 属性。btnNewinitWithFrame:

- (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 架构中处理事件和用户交互的方式。

我猜问题出self在 in [view.btnNew setTarget:self];。如果我用 抓住目标view.btnNew.target,这是一个零对象(0x000…000)。Self存在与view.btnNew存在。

难道我做错了什么?或者我应该真正听取视图中的点击并使用委托或通知(我猜不是?)

4

1 回答 1

2

在Niel Deckx的帮助下,我自己发现了。

问题是ARC。ViewController 在单击发生之前被释放,这解释了NSObject 不响应选择器:目标不再存在。

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

于 2013-07-09T16:46:58.513 回答