2016-10-13 3 views
2

У меня есть контроллер с табличным представлением на нем. Определили свои ячейки в представлении, а затем привязали его к представлению таблицы. (Извините за терминологию). Приложение строит и работает нормально, но ни одна из ярлыков, определенных в ячейке, ничего не показывает. Вся таблица пуста, за исключением разделителей ячеек. Я следил за многочисленными учебниками и много раз искал SO по причинам, как создавать (Create a Table View - Apple docs), настройки для проверки, все с теми же результатами. Я также попытался очистки, перезапуск Xcode и т.д. Это Xcode 8/Swift 3.Swift/Как заполнить UITableViewCells

Контроллер вид имеет вид таблицы и зарегистрировать класс клеток, как это в viewDidLoad

self.tableView.registerCellClass(MenuTableViewCell.self) 

UITableViewDataSource код

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return menusItems.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: MenuTableViewCell.identifier, for: indexPath) as! MenuTableViewCell 

    let item = menusItems[indexPath.row] 
    cell.setData(item) 
    return cell 
} 

MenuItems представляет собой массив из структуры я, что создается, прежде чем что-либо еще будет сделано

BaseTableViewCell

open class BaseTableViewCell: UITableViewCell { 
class var identifier: String { return String.className(self) } 

public required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    setup() 
} 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    setup() 
} 

open override func awakeFromNib() { 
} 

open func setup() { 
} 

open override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

open class func height() -> CGFloat { 
    return 48 
} 

open func setData(_ data: Any?) { 
    if let menuText = data as? String { 
     self.textLabel?.text = menuText 
    } 
    if let menuImage = data as? UIImage { 
     self.imageView?.image = menuImage 
    } 
} 
} 

Просмотр таблицы кода Cell - наследует BaseTableViewCell

class MenuTableViewCell: BaseTableViewCell { 

//MARK: Properties 
@IBOutlet weak var name: UILabel! 
@IBOutlet weak var icon: UIImageView! 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
    // Configure the view for the selected state 
} 

override func setData(_ data: Any?) { 
    if let data = data as? MenuTableViewCellData { 
     NSLog("menu name - %@", data.text) 
     self.icon?.image = data.image 
     self.name?.text = data.text 
    } 
} 
} 

Все названия меню записываются в области отладки, поэтому код выполняется.

Я не знаю, есть ли недостаток крючка или что-то еще. Пожалуйста, дайте мне знать, если что-то еще необходимо. Любая помощь приветствуется.

Скриншоты показывающие IBOutlets подключен name

icon

Вот делегат и источник данных от контроллера

extension LeftViewController : UITableViewDelegate { 
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return MenuTableViewCell.height() 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if let menu = LeftMenu(rawValue: indexPath.row) { 
     self.changeViewController(menu) 
    } 
} 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if self.tableView == scrollView { 

    } 
} 
} 

extension LeftViewController : UITableViewDataSource { 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return menusItems.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: MenuTableViewCell.identifier, for: indexPath) as! MenuTableViewCell 

    let item = menusItems[indexPath.row] 
    cell.setData(item) 
    return cell 
} 
} 

Спасибо всем за вашу помощь. Я смог заставить его работать. Я удалил XIB-файл, создал макет в представлении, а затем подключил его оттуда (после этого следует here).

+0

где вызывается меню? Отправьте свой код – Rob

+0

, вы проложили розетки с помощью конструктора интерфейса? –

+0

@MatiasElorriaga я сделал. –

ответ

2

Проверьте, что вы подключили IBOutlets к name и icon в MenuTableViewCell. Предполагая, что вы говорите правду, что вызывается NSLog в setData, скорее всего, вы не подключили IBOutlets для подкласса ячейки таблицы.

+0

Я только что проверил инспектор подключений, и он показывает ссылочные точки для имени и значка –

+0

. Снимок экрана, чтобы показать, что –

+0

Добавлены скриншоты. –

0

У вас могут быть строки с высотой 0 строк. Я вижу метод height - что его называют? Есть ли у вас реализация

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

где-то?

Вы настраиваете вид стола rowHeight?

+0

Да. Делегат возвращает высоту строки из return MenuTableViewCell.height(), которая наследует от BaseTableViewCell, которая имеет высоту, определенную как 48 –

-1

Можете ли вы проверить, имеют ли имя и значок соответствующие ограничения

+0

Как это сделать? имя и значок были созданы только из перетаскивания из библиотеки объектов. Атрибуты - все значения по умолчанию –

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