我有一个简单的测试应用程序(在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位置(控制器类不应该处理这些)?
答案 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
。