2015-02-02 2 views
4

Я пытаюсь реализовать NSOutlineViewDataSource с Swift и при использовании строк Swift приложение просто сбой. Когда я меняю массив people на NSString, он отлично работает.NSOutlineViewDataSource и Swift

В соответствии с 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

+0

Я не могу воспроизвести это поведение. Используя исключительно код, который вы предоставляете, когда я использую '' String'' или '' NSString'', я не получаю сбой, всего три пустые строки. Выполняете ли вы какие-либо методы делегата или используете привязки для получения значений, отображаемых в ячейках? –

+0

Я подтолкнул проект к Github, чтобы его было легче воспроизвести. Я использую раскадровки и просто подключил выход источника данных NSOutlineView' к 'ViewController'. 'ViewController' просто реализует' NSOutlineDataSourceProtocol'. Я также использую «NSOutlineView» на базе ячеек. –

+0

Спасибо за демо-приложение - теперь у меня есть поведение (я предположил, что вы используете OV на основе представления). –

ответ

2

Я всегда немного неохотно маркировать поведение я не понимаю, как ошибка, но это чувствует, как один ко мне.

При входе значения, которые передаются в к 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.

Также интересен тот факт, что не существует какой-либо проблемы с использованием значений String в ячейке NSTableView - я получил ваши данные в одном без проблем.

Итак, мой короткий ответ на ваш вопрос Почему это происходит? был бы предварительным , потому что вы нашли ошибку - но ошибку на ячейке NSOutlineView, а не ошибку, а не ошибку String.

+0

Спасибо, что посмотрели на него. Я отправил отчет об ошибке в Apple. –

+1

Эта проблема была решена в Xcode 6.3 beta 4. –

 Смежные вопросы

  • Нет связанных вопросов^_^