在NSTableView / UITableView

时间:2016-06-27 06:39:29

标签: ios swift macos cocoa nstableview

我已经在this之后以编程方式(仅限代码,没有XIB)构建了基于视图的NSTableView,它由NSArrayController支持,简单地由:var controller = NSArrayController()创建并绑定到表中:

tableView.bind(NSContentBinding, toObject: controller, withKeyPath: "arrangedObjects", options: nil)
tableView.bind(NSSelectionIndexesBinding, toObject: controller, withKeyPath:"selectionIndexes", options: nil)
tableView.bind(NSSortDescriptorsBinding, toObject: controller, withKeyPath: "sortDescriptors", options: nil)

我只使用controller方法添加/删除对象,并通过以下方式获取对象:(controller.arrangedObjects as! NSArray)[index]。数组中的项目属于具有String?dynamic Double字段的类,它们从NSObject延伸。

在模型中添加和删除行会自动添加/删除表中的相应行,但我无法将单元格视图绑定到项目 - 并观察其字段中的更改。我试图关注thisthis但没有运气。我的单元格视图的最终版本如下:

class PLTextCellView: NSTextField {
    init(columnName:String) {
        //.... erased...
        self.columnName = columnName
    }
    var columnName = ""

    var displayText:AnyObject {
        get {
            return stringValue
        }
        set(val) {
            stringValue = String(val)
        }
    }

    weak
    var item:PLItem? = nil

    override
    var objectValue: AnyObject? {
        didSet {
            item = objectValue as? PLItem
            if (item != nil) {
                Swift.print("item to bind is:\(item) ")
                unbind("displayText")
//                bind("displayText", toObject: self.item!, withKeyPath: columnName, options: [NSNullPlaceholderBindingOption:"--"])
                bind("displayText", toObject: self, withKeyPath: "objectValue."+columnName, options: [NSNullPlaceholderBindingOption:"--"])
            } else {
                Swift.print("unbinding... ")
                unbind("displayText")
            }
        }
    }

    deinit {
        unbind("displayText")
    }

    override
    func prepareForReuse() {
        unbind("displayText")
        super.prepareForReuse()
    }
    ///... erased ....
}

如果我不使用任何绑定,我只会在每个列的表格上显示 item 对象ID,即使我明确设置了{{1} (所以必须在内部设置文本!)

问题 1:如果我使用注释/第一displayText行,则每个bind对象会向控制台输出不同的对象ID - 即使某些对象代表相同的对象 - item中没有一个存在!为什么

问题 2:如果我使用未注释的/ controller行,我会收到此错误:bindThis说我不应该在单元格视图中进行绑定/观察,但最方便的地方似乎是单元格视图(对于MVC)。我不知道如何删除An instance of ...item... was deallocated while key value observers were still registered with it.中模型项中的所有-view-bindings。 (有趣的是,我甚至不删除deinit中的任何项目)。

据我从相关问题和答案中了解,这个问题也适用于controller。那么,绑定

的正确方法是什么?

0 个答案:

没有答案