【问题标题】:NSOutlineViewDataSource and SwiftNSOutlineViewDataSource 和 Swift
【发布时间】:2015-02-02 18:54:29
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 我无法重现这种行为。仅使用您提供的代码,当我使用 StringNSString 时,我不会崩溃,只有三个空行。您是在实现任何委托方法,还是使用绑定来获取单元格中显示的值?
  • 我已将项目推送到 Github,因此可能更容易重现。我正在使用故事板并将NSOutlineView 数据源出口连接到ViewControllerViewController 只是实现了NSOutlineDataSourceProtocol。我也在使用基于单元格的NSOutlineView
  • 感谢演示应用程序 - 我现在已经掌握了行为(我假设您使用的是基于视图的 OV)。
  • stackoverflow.com/questions/28134062/… 这个答案有效,我对 swift Strings 没有任何问题
  • 这是我使用 Appcode 运行时得到的崩溃报告:raw.githubusercontent.com/tanob/ExampleNSOutlineView/master/…

标签: macos cocoa swift nsoutlineview


【解决方案1】:

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

如果您在填充表格时记录传入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>)
// ...

大多数情况下,这个实现也会崩溃,但有时大纲视图确实会加载 - 当然这三个单元格中的每一个都有值 junk

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

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

【讨论】:

  • 感谢您的调查。我已经向 Apple 提交了错误报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多