macos – NSOutlineViewDataSource和Swift

我正在尝试使用
Swift实现一个NSOutlineViewDataSource,当使用Swift字符串时,应用程序就会崩溃.当我将数组人员更改为NSString时,它可以正常工作.

根据Working with Cocoa Data Types,当您导入Foundation时,字符串桥接应该是自动的.

这是数据源代码:

import Cocoa
import Foundation

class ViewController: NSViewController, NSOutlineViewDataSource {

    let people: [String] = ["Mary", "John", "Paul"] // when using NSString it works fine

    func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int {
        return item == nil ? people.count : 0
    }

    func outlineView(outlineView: NSOutlineView, isItemExpandable item: AnyObject) -> Bool {
        return false
    }

    func outlineView(outlineView: NSOutlineView, child index: Int, ofItem item: AnyObject?) -> AnyObject {
        return people[index]
    }

    func outlineView(outlineView: NSOutlineView, objectValueForTableColumn tableColumn: NSTableColumn?, byItem item: AnyObject?) -> AnyObject? {
        return item
    }
}

知道为什么会这样吗?

Xcode版本6.1(6A1052d)

Xcode项目在这里托管:https://github.com/tanob/ExampleNSOutlineView

最佳答案 我总是有点不愿意将我不理解的行为标记为一个bug,但这对我来说就像是一个.

如果在填充表时记录传递给outlineView:objectValueForTableColumn:byItem的值,则在第三次调用之后,item的值是意外的(使用NSString,值始终是您的项目之一):

func outlineView(outlineView: NSOutlineView, 
    objectValueForTableColumn tableColumn: NSTableColumn?, 
    byItem item: AnyObject?) -> AnyObject? {
        callCount++
        if callCount > people.count {
            println(item)
            return "junk"
        } else {
            return item
        }
    }

// output ->
// call count: 1; <item> value: Optional(Mary)
// call count: 2; <item> value: Optional(John)
// call count: 3; <item> value: Optional(Paul)
// call count: 4; <item> value: Optional(<__NSBlockVariable__: 0x60000004cb40>)
// call count: 5; <item> value: Optional(<RIPData 0x608000043300>) // surely not good!
// call count: 5; <item> value: Optional(<RIPData 0x608000043390>)
// ...

大多数情况下,这种实现也会崩溃,但偶尔大纲视图确实会加载 – 尽管三个单元格中的每一个都具有值垃圾.

同样有趣的是,在基于单元格的NSTableView中使用String值似乎没有任何问题 – 我将您的数据放入一个没有问题.

所以我对你的问题的简短回答为什么会这样?因为你发现了一个错误 – 但是基于单元格的NSOutlineView错误,而不是一个String错误,这将是一个试探性的.

点赞