【问题标题】:How do I use Action Invocation in Xcode Interface Builder如何在 Xcode Interface Builder 中使用动作调用
【发布时间】:2020-08-15 22:02:30
【问题描述】:

在使用 Argument 绑定时,我无法让 IB Action Invocation 工作。有人可以解释这是如何工作的。如果我不使用 Argument 绑定,则绑定有效,但使用 nil 参数调用该方法。我假设 Argument 绑定旨在设置将在方法调用中传递的参数。就我而言,我想获得对 Table Cell Views 对象的引用。 我收到如下编译器错误:

Exception while running ibtool: *** -[__NSArrayM insertObject:atIndex:]: object cannot be nil

我正在将操作调用绑定到表格单元视图中的按钮。

【问题讨论】:

  • 你所做的看起来不错(但我已经很久没有使用可可绑定了......)。
  • 看起来像一个错误。解决方法:不要使用动作绑定,将按钮的动作连接到调用cancel的动作方法。
  • @Willeke 我希望将 objectValue 作为参数传递,而使用按钮操作是不可能的。还希望避免子类化表格单元格视图并使用数据源和委托。破解方法是强制用户在允许单击按钮之前选择表格行,但这对用户来说效率不高。
  • 可以给table view的delegate添加action方法吗?在这个动作方法中你可以获取对象值并调用cancel
  • @Willeke 不确定您的意思,我没有使用委托或数据源,而是直接使用 NSArrayController 作为表格视图的内容。也不确定您指的是哪个委托方法或如何从按钮操作中调用它。

标签: xcode cocoa interface-builder cocoa-bindings


【解决方案1】:

解决方法:

在报表队列表视图控制器类中:

  • 将协议NSTableViewDelegate 添加到声明中。您不必实现任何方法。
  • 为阵列控制器和表格视图添加插座。
  • 添加操作方法
@IBAction func cancelAction(_ sender: NSButton) {
    let row = tableView.row(for: sender)
    if let objects = arrayController.arrangedObjects as? [String] {
        let object = objects[row]
        cancel(object)
    }
}

在 IB 中:

  • 连接插座。
  • 将表视图的委托连接到报表队列表视图控制器。
  • 将按钮的操作连接到报告队列表视图控制器的cancelAction
  • 删除按钮操作绑定。

【讨论】:

  • 嗯,所以'tableView.row(for:sender)'函数会为按钮找到行,记住tableCellView上除了按钮之外还有许多控件?我会尝试一下,因为它是一种更优雅的方法。
猜你喜欢
  • 2015-12-25
  • 1970-01-01
  • 2012-03-28
  • 2011-03-13
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多