Swift /如何填充UITableViewCells

时间:2016-10-13 17:35:14

标签: ios swift

我有一个带有表格视图的控制器。在视图中定义了我的单元格,然后将其绑定到表视图。 (请原谅这个术语)。应用程序构建并运行良好,但单元格中定义的标签都没有显示任何内容。除细胞分离器外,整个表是空白的。我已经按照大量的教程进行了广泛搜索,原因是如何创建(Create a Table View - Apple docs),要检查的设置,所有结果都相同。我也尝试过清理,重新启动Xcode等。这是Xcode 8 / Swift 3。

视图控制器有一个表视图,我在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
    }
}
}

表视图单元代码 - 继承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

3 个答案:

答案 0 :(得分:2)

确认您已IBOutlets nameicon中的MenuTableViewCell相关联。假设你说的是真的,NSLog中的setData被调用,你可能没有连接IBOutlets表视图单元子类。

答案 1 :(得分:0)

您可能有0行高。我在那里看到一个height方法 - 它叫什么?你有

的实现吗?
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat

某处?

您是否设置了表格视图' rowHeight

答案 2 :(得分:-1)

您可以检查名称和图标是否有适当的约束