objective-c - 设置 Action : in NSViewController

标签 objective-c cocoa

了解我来自 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/

相关文章:

iphone - 努力清除 CGLayer 中的所有数据——这能做到吗?

cocoa - 如何访问/嵌入 Finder 功能?

xcode - 使应用程序启动时的大小和位置与关闭时相同

objective-c - 防止自定义工作表抢夺焦点

objective-c - 经纬度中点到直线的最小距离

ios - UILocalNotification 延迟 1 小时

ios - 仅在验证输入后启用 UIAlertController 的 UIAlertAction

objective-c - 自定义日志记录宏不接受多个参数

ios - Swift - GoogleMaps SDK 获取单指或双指点击手势

iphone - 如何调用 "Turn Off Airplane Mode"通知