视图控制器不响应操作方法

时间:2012-06-02 03:12:46

标签: objective-c macos model-view-controller nsviewcontroller

我有一个简单的测试应用程序(在OSX中),它有一个视图控制器,在其视图中有一个按钮。按钮的操作方法位于视图控制器的类中,IBAction在IB中连接(通过文件的所有者)。单击该按钮时,我收到一个EXC_BAD_Access错误(偶尔我会得到 - [NSRunLoop buttonClick:])。我已经在这里阅读了很多帖子,因为NSViewControllers不在响应者链中,而且特别是在IB中挂起动作方法应该有效。我唯一的代码是:

在app delegate中:

- (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位置(控制器类不应该处理这些)?

3 个答案:

答案 0 :(得分: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)?”。你的意思并不是很清楚。

希望这有点帮助。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我建议您检查一下viewController的身份检查员。 它可能表示错误的自定义类。 创建的viewController基本上通常在节上有名称ViewController