gpt4 book ai didi

objective-c - 设置 Action : in NSViewController

转载 作者:行者123 更新时间:2023-12-03 16:37:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com