0

我有一个简单的测试应用程序(在 OSX 中),它有一个视图控制器,其视图中有一个按钮。按钮的操作方法在视图控制器的类中,并且 IBAction 在 IB 中连接(通过文件的所有者)。单击按钮时,我收到 EXC_BAD_Access 错误(除了偶尔会收到 -[NSRunLoop buttonClick:] )。我在这里阅读了一堆关于 NSViewControllers 不在响应者链中的帖子,而且在 IB 中专门挂钩操作方法应该可以工作。我唯一的代码是这样的:

在应用委托中:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    TestController *controller = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];
    [self.window.contentView addSubview:controller.view];
}

而且,在 TestController 类中,就是这样:

-(IBAction)buttonClick:(id)sender {
    NSLog(@"%@",sender);
}

我有 2 个问题。为什么会发生这种情况,以及将 IBActions 用于按钮方法的正确 mvc 位置在哪里(控制器类不应该处理这些)?

4

3 回答 3

0

首先,我相信在 App Delegate 中已经viewController为您定义了一个名为的属性。您应该使用此代码self.viewController = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];而不是TestController *controller = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];. 如果这不能解决它,那么我不确定出了什么问题。您的代码应返回您单击的按钮的属性。我创建了自己的示例项目并测试了您的代码(尽管我的应用程序委托看起来与您的不同)并且运行良好。

其次,您应该详细说明您的第二个问题“ Why is this happening, and where is the correct mvc place to put IBActions for button methods (shouldn't controller classes handle these)?”。你的意思不是很清楚。

希望这有所帮助。

于 2012-06-02T04:19:10.867 回答
0

NSViewController 不会在 iPhone 上的 mac os x 上响应 IBAction 这是放置 IBAction 的正确位置,因为视图应该只绘制其内容(数据)而不是更改它。但是在 Mac os x 上, NSViewController 用于设置 NSView ,它没有必要响应 IBActions 你有两种选择,一种是将你的 IBAction 放在你的 NSView 中,或者是创建一个 NSWindowController 。在 mac osx 上,您有足够的屏幕空间,并且您将始终在窗口中拥有视图,您将使用 NSViewController 将它们添加到您的窗口并设置您的视图,但该窗口首先在您的响应者链中,然后是您的 NSWindowController 。例如:您可能有一个窗口和两个视图控制器显示相同的视图,其中可能有 5 个测试字段,视图控制器一会加载数据但您无法编辑数据,然后视图控制器二会加载相同的视图和相同的数据,但启用编辑文本字段。但所有操作方法都将转到 WindowController 。

于 2012-07-30T07:32:34.863 回答
0

我建议你检查你的 viewController 的身份检查器。它可能表示错误的自定义类。基本上创建的视图控制器通常ViewController在部分上有名称。

于 2015-06-19T08:50:29.153 回答