【问题标题】:View Controller Doesn't respond to Action Methods视图控制器不响应操作方法
【发布时间】:2012-06-02 03:12:46
【问题描述】:

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

【问题讨论】:

  • qegal 的答案虽然写得好像你在 iOS 上一样,但基本上可以为你解决问题。您将创建的视图控制器放入局部变量中,并立即释放(通过 ARC)。这意味着当按钮被按下时,它正在向一个无效对象发送消息。如果您在应用程序委托中创建一个strong 属性来保存控制器并分配给它,那么一切都会正常工作。视图控制器通常是放置IBAction 方法的正确位置。

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


【解决方案1】:

首先,我相信 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)?”。你的意思不是很清楚。

希望这会有所帮助。

【讨论】:

  • 不,应用程序委托中没有定义 viewController ——这个 OSX 不是 iOS。至于第二个问题,我只是想弄清楚从视图控件处理操作方法的 mvc“正确”方式是什么。什么类应该实现这些方法?如果我将它们放在子类视图中,它们就可以工作,但我的理解是视图不应该做这种事情,它们只是为了显示。
  • 您应该将 IBActions 放在您希望 IBActions 作用的视图的控制器中。
  • 这正是行不通的。我的视图控制器中有 IBActions。
  • 好吧,有些事情搞砸了。它应该在那里。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多