Macos NSOutlineViewer数据源和Swift

Macos NSOutlineViewer数据源和Swift,macos,cocoa,swift,nsoutlineview,Macos,Cocoa,Swift,Nsoutlineview,我正在尝试用Swift实现NSOutlineViewDataSource,当使用Swift字符串时,应用程序简直崩溃了。当我将数组people更改为NSString时,它工作正常 在导入基础时,字符串桥接应是自动的。< /P> 以下是数据源代码: import Cocoa import Foundation class ViewController: NSViewController, NSOutlineViewDataSource { let people: [String] =

我正在尝试用Swift实现NSOutlineViewDataSource,当使用Swift字符串时,应用程序简直崩溃了。当我将数组
people
更改为NSString时,它工作正常

在导入基础时,字符串桥接应是自动的。< /P> 以下是数据源代码:

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项目托管在这里:

我总是有点不愿意将我不理解的行为标记为bug,但我觉得这是一个bug

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

func大纲视图(大纲视图:NS大纲视图,
objectValueForTableColumn表列:NSTableColumn?,
按项目:AnyObject?->AnyObject?{
呼叫数++
如果callCount>people.count{
println(项目)
退回“垃圾”
}否则{
退货项目
}
}
//输出->
//通话次数:1;值:可选(玛丽)
//通话次数:2次;值:可选(John)
//通话次数:3次;值:可选(Paul)
//通话次数:4次;值:可选()
//通话次数:5次;value:Optional()//当然不好!
//通话次数:5次;值:可选()
// ...
大多数情况下,此实现也会崩溃,但有时outline视图确实会加载—当然,三个单元格中的每一个都有值

另一个有趣的事实是,在基于单元格的
NSTableView
中使用
String
值似乎没有任何问题-我将您的数据整合到一个没有问题的视图中


那么我对你的问题的简短回答是为什么会发生这种情况?这将是一个暂时性的错误,因为您发现了一个错误-但是是一个基于单元格的
NSOutlineView
错误,而不是一个
String
错误。

我无法重现这种行为。仅使用您提供的代码,当我使用
String
NSString
时,我没有崩溃,只有三个空行。您是否实现了任何委托方法,或者使用绑定来获取显示在单元格中的值?我已将项目推送到Github,以便更容易复制。我正在使用故事板,只需将
NSOutlineView
数据源出口连接到
ViewController
ViewController
只实现了
NSOutlineDataSourceProtocol
。我也在使用基于cell的
NSOutlineView
。感谢您的演示应用程序-我现在已经了解了这种行为(我假设您使用的是基于视图的OV)。这个答案很有效,我对swift StringsHere的《我在运行Appcode时得到的崩溃报告》没有任何问题:感谢您的关注。我已经向苹果公司提交了一份错误报告。
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>)
// ...