我正在尝试使用
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错误,这将是一个试探性的.