2015-03-19 3 views
0

Итак, я прочитал article по адресу objc.io о функциональных TableViewControllers. Звучит и выглядит чистым, поэтому я должен был попробовать.Общий UITableViewController в Swift компилирует, но не перезагружает свои данные

import Foundation 
import UIKit 

class TableViewController<A>: UITableViewController { 

    override init(style: UITableViewStyle) { 
     super.init(style: style) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    var data: [A] = [] { 
     didSet { self.tableView.reloadData() } 
    } 

    var configureCell: (UITableViewCell, A) ->() = { _ in() } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil) 
     configureCell(cell, data[indexPath.row]) 
     return cell 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.data.count 
    } 
} 

Это компилируется просто отлично. Я инициализирую его i следующим кодом.

let controller = TableViewController<String>(style: .Plain) 
controller.configureCell = { (cell:UITableViewCell, data:String) in 
    cell.textLabel?.text = data 
} 
controller.data = ["1", "2"] 

Но numberOfRowsInSection никогда не вызывается (и для этого ни cellForRowAtIndexPath). didSet { self.tableView.reloadData() }, однако, называется.

Я также проверил, что tableView имеет свои данные. Источник и делегат сидят правильно.

Итак, если я удалю это <A> в объявлении класса и заменим все остальные String. Он работает отлично.

Любые идеи в чем-то не так?

ответ

2

Ошибка в нашем примере кода. Извини за это. Я виноват.

Проблема, вероятно, в том, что вы не можете создать общий подкласс класса, не относящегося к общему классу ... Скоро вытолкнут исправление.

+0

Привет, Крис. Проверьте мой ответ в этом сообщении. – dimpiax

+0

См. Также: http://www.objc.io/snippets/22.html –

+0

«Любой» не замаскирован как общий. Не выглядит красиво. – dimpiax

-2

Вы можете попробовать перезагрузить данные, используя viewWillAppear. Когда появится представление, оно перезагрузит данные и обновит таблицу. Попробуйте этот код:

override func viewWillAppear(animated: Bool) { 
    YourTableName.reloadData(); 
} 
0

Ваш стол не знает, сколько у вас разделов.

Сначала необходимо реализовать numberOfSectionsInTableView:. Как только он узнает, сколько секций будет запрашивать каждую секцию строк.

+0

Я уже пробовал это. Не помогает. И, как я описал, просто устраняя родословность класса, он работает. Так что это нечто другое. – Konrad77

+0

Полагаю, это опечатка в вашем вопросе о том, что класс определяется как TableViewContorller , а не TableViewController . Возможно, стоит обновить код до того, что у вас есть сейчас. –

+0

Вы используете последний xcode? Кажется, это была ошибка в xcode 6.1. Вам нужно 6.1.1 или выше. http://stackoverflow.com/questions/27143992/swift-bug-calling-super-class-method-when-subclass-with-generic-type –

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