NSOutlineViewDataSource和Swift

时间:2015-02-02 18:54:29

标签: macos cocoa swift nsoutlineview

我正在尝试使用Swift实现一个NSOutlineViewDataSource,当使用Swift字符串时,应用程序就会崩溃。当我将数组people更改为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

1 个答案:

答案 0 :(得分:2)

我总是有点不愿意将我不理解的行为标记为错误,但这对我来说就像是一个。

如果在填充表格时记录传递给outlineView:objectValueForTableColumn:byItem的值,则在第三次调用后item的值是意外的(使用NSString时,值始终为1你的物品):

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>)
// ...

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

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

所以我对你的问题的简短回答为什么会发生这种情况?会是一个暂时的,因为你发现了一个错误 - 但是基于单元的{{1}错误,而不是一个NSOutlineView错误。