2015-10-19 10 views
1

Я в настоящее время учится Swift programatically. Я хочу добавить tableView в viewController (с целью управления ограничениями позже) и настроить ячейки с помощью TableViewCell.Пустые ячейки в TableView с пользовательским TableViewCell - Swift

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

Мой раскадровки состоит из одного (1) пустого viewController, который имеет собственный класс ViewController

Я смотрел на других с подобными проблемами, но не решения работали. Хотелось бы узнать, что я просматриваю (возможно, что-то простое). Заранее спасибо за помощь!

ViewController.swift:

import UIKit 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ 
var tableView: UITableView = UITableView() 
var items: [String] = ["Viper", "X", "Games"] 

override func viewDidLoad() { 

    tableView.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height) 
    tableView.delegate = self 
    tableView.dataSource = self 

    tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell") 

    self.view.addSubview(tableView) 
} 

func tableView(tableView:UITableView, heightForRowAtIndexPath indexPath:NSIndexPath)->CGFloat 
{ 
    return 50 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return self.items.count 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 3 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 

    //cell.textLabel?.text = self.items[indexPath.row] 
    cell.companyName.text = "name" 

    return cell 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
} 

TableViewCell:

import UIKit 

class TableViewCell: UITableViewCell { 

var companyName = UILabel() 

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

    companyName.frame = CGRectMake(0, 0, 200, 20) 

    companyName.translatesAutoresizingMaskIntoConstraints = false 

    contentView.addSubview(companyName) 
} 

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

    // Configure the view for the selected state 
} 

} 

ответ

3

Здравствуйте @Michael Первым делом вы должны использовать только awakeFromNib, когда вы используете .xib (СИБ) и в вашем случае, если вы используете собственный класс без такого XIB так, вы должны использовать

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

    companyName = UILabel(frame: CGRectMake(0, 0, 200, 20)) 
    contentView.addSubview(companyName) 

} 

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

также вы должны инициализировать свою этикетку перед ее использованием. это решит вашу проблему.

Прочитайте документацию по ядру для подкласса UITableViewCell here.

+0

Спасибо! Это то, что я получил после того, как @replman указал в правильном направлении. Что вы подразумеваете под «инициализацией своего ярлыка перед его использованием». Он инициализирован. – Geppelt

+0

Вы просто установили рамку UILabel, так как вы не сделали xib для своей ячейки лучше, чтобы сделать это, прежде чем добавлять ее в любой вид, так что вы не получите нулевой объект. также вы должны реализовать метод prepareForReuse в классе ячеек для очистки перед следующим использованием объекта. –

+0

Мне не нужен xib-файл, и я не понимаю, что вы имеете в виду; UIImageView объявляется, обрамляется и добавляется. Я не являюсь опытом и проблемой с нулевыми объектами. – Geppelt

1

Если вы хотите, чтобы ваш заказ ячейки для загрузки из некоторых пользовательских XIB вы иногда как:

tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "CustomTableViewCell") 

И у вас должен быть файл CustomTableViewCell.xib, в котором у вас есть ячейка таблицы с идентификатором повторного использования CustomTableViewCell

+0

Да, но, как я уже сказал, я делаю программно. Поэтому я вместо этого зарегистрировал класс. – Geppelt

+0

Помогает мне, спасибо. Статья об этом подходе: https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722 – comm1x

0

Оформить заказ, как выстроили companyLabel вашей ячейки. Существует ли это или нет?

В вашем коде я заменил companyLabel по умолчанию textLabel, и это сработало для меня.

cell.textLabel!.text = self.items[indexPath.row] 
+0

Это текстовая метка по умолчанию для ячейки (выровненный центр Y). Мой ярлык «companyName» расположен 0,0, поэтому, если он появится, он будет заправлен в верхнем левом углу. Я пытаюсь понять это, чтобы добавить больше элементов в TableViewCell. – Geppelt

+0

Идея здесь - ничего плохого в вашем представлении таблицы. Если отображается текстовая метка ячейки по умолчанию, ваша область отладки сужается до пользовательской ячейки. Удачи! – Abhinav

0

Я думаю, что awakeFromNib не вызывается, потому что вы не регистрируете нить, кроме класса. Попробуйте вместо этого:

class TableViewCell: UITableViewCell { 
    let companyName = UILabel() 

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

     // Initialization code 
     companyName.frame = CGRectMake(0, 0, 200, 20) 
     companyName.translatesAutoresizingMaskIntoConstraints = false 
     contentView.addSubview(companyName) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 
+0

Как это будет выглядеть? – Geppelt

+0

Что-то вроде этого: 'override init (style: UITableViewCellStyle, reuseIdentifier: String?) {super.init (style: style, reuseIdentifier: reuseIdentifier) ​​ }' – Geppelt

+0

Это сделало трюк! Спасибо за поддержку @replman – Geppelt

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