2016-09-12 7 views
1

Я только что обновил до xCode Version 8.0 (8A218a). Я пытаюсь преобразовать старый код в Swift 3.0, и я изо всех сил пытаюсь понять, как исправить некоторые проблемы с помощью tableView, и я смущен документацией и некоторыми ошибками, которые я получаю.Каков правильный синтаксис для функций tableView в Swift 3? xCode 8 issues

Я получаю эту ошибку

*** Illegal источник NSTableView данных(). Необходимо реализовать numberOfRowsInTableView: и Tableview: objectValueForTableColumn: строка:

При выполнении этого кода:

class listMusicEvents: ViewController, performanceDataModelDelegate, NSTableViewDelegate, NSTableViewDataSource { 

let eventModel = performanceDataModel.sharedInstance 
var musicEvents:[performanceEvent] = [] 


@IBOutlet var tableView: NSTableView! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    eventModel.delegate = self 
    tableView.delegate = self 
    eventModel.getPerformanceEvents() 
} 

func performanceEventsLoaded() { 

    musicEvents = eventModel.eventList 
    print(musicEvents[0].eventTitle) 
} 

func performanceSaveError(headline: String, message: String, error: NSError) { 
    print(error) 
} 

func numberOfRowsInTableView(in tableView: NSTableView) -> Int { 
    return musicEvents.count 
} 

func tableView(_tableView:NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> AnyObject{ 

    if tableColumn?.title == "Date" { 
     let date = musicEvents[row].eventDate 
     return date as AnyObject 

    } else { 

     let title = musicEvents[row].eventTitle 
     return title as AnyObject 
    } 

} 

}

Я думал, что я реализовал новые методы, но это выглядит, как я не понимая что-то основное.

Я получаю предупреждение о функции objectValueFor:

метод Instance 'Tableview (Tableview: objectValueForRow: строка :)' почти матчи факультативное требование «Tableview (: setObjectValue: для: строки:) из протокола «NSTableViewDataSource»

Я смотрел на делегат документы, и они говорят setObjectValue не должно использоваться для просмотра на основе Tableview, который является то, что у меня есть (я думаю).

Кода я использовал первоначально для столбца таблицы был:

tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? { . . . 

Эта линия работала отлично перед засаливанием проекта в Xcode 8

Может кто-то пожалуйста, объясните, как вид на основе tableViews должны работать со Swift 3 и что я ошибаюсь? Любая помощь очень ценится.

+1

Просто позвольте Xcode автоматически завершить его для вас. Попробуйте Any, а не AnyObject –

+0

У меня есть усталость, позволяющая автомонтажу. Я могу избавиться от предупреждения, которое нравится в версии xCode: 'tableView (_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn ?, row: Int) -> Any?' Тем не менее, я все еще получаю ошибку нелегального источника данных. Я тщательно проверил инспектор подключений, очистил проект и т. Д. –

+0

Я проверил его на реальном проекте https://www.dropbox.com/s/88zszm4byjqvzld/Screen%20Shot%202016-09-30%20at% 2010.51.57% 20 AM.png? Dl = 0 Итак, вы можете видеть, что ошибок нет. –

ответ

0

Перезагрузите компьютер, удалив неиспользуемый источник данных NSTableView. Я предполагаю, что xCode 8 работал в состоянии, в котором он не мог отпустить ошибку.

Функция objectValueFor, предоставляемая автоматически завершенной, была правильной.

0

Я решил эту проблему следующим образом. Добавить NSTableViewDataSource протокол к классу ViewController.

class ViewController: NSViewController,NSTableViewDataSource{ 

    // snip // 

    func numberOfRows(in tableView: NSTableView) -> Int {   

     // snip // 

     return count 
    } 

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any?{ 

     // snip // 

     return element 
    } 
} 
0

Обновление для Swift 3

Я должен был использовать следующие прототипы ...автозаполнение ваш друг:

func numberOfRows(in tableView: NSTableView) -> Int 

и

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?