iOS TableView自定义单元格不显示任何内容

时间:2018-09-19 03:59:49

标签: ios swift uitableview

我是iOS和Swift的新手,我试图通过创建一个简单的Todo应用程序来学习一些知识。我遇到的问题是,无论我如何实现代码(接续多个教程)和情节提要,数据都不会显示,并且自定义单元格也不会自定义(即使我已自定义,它看起来也像默认单元格一样)它)。我已经连接了delegatedataSource

编辑:我已经分配了重用标识符

TodosView.swift

import UIKit

class TodosView: UIViewController {
    @IBOutlet weak var todosTable: UITableView!

    var todos: [Todo] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        todosTable.delegate = self
        todosTable.dataSource = self

        self.addTodo()
    }

    func addTodo() {
        let todo1 = Todo(text: "My first todo")
        let todo2 = Todo(text: "My second todo")

        todos = [todo1, todo2]
    }
}

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let todo = todos[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell") as! TodoCell

        cell.setTodo(todo: todo)

        return cell
    }
}

TodoCell.swift

import UIKit

class TodoCell: UITableViewCell {
    @IBOutlet weak var todoText: UILabel!

    func setTodo(todo: Todo) {
        todoText.text = todo.text
    }
}

Todo.swift

import Foundation

struct Todo {
    var text: String
    var done: Bool

    init(text: String, done: Bool = false) {
        self.text = text
        self.done = done
    }
}

4 个答案:

答案 0 :(得分:5)

我成功地使用您的代码成功生成了您的Todo行(调用reloadData()后我没有addTodo()

enter image description here

已经证明您的代码可以正常工作,这使我相信您在Storyboard设置中的某个地方比在代码本身中更容易遇到问题。一些建议:

验证您的自定义单元是否被分类为TodoCell 。您可以通过在Interface Builder中单击TodoCell来执行此操作,然后在 Identity Inspector 标签中,确认已将此设置为TodoCell:

enter image description here

这可能不是问题,因为如果单元的分类不正确,您的应用很可能会崩溃。

验证您已在Interface Builder中设置了单元格标识符。再次,在Interface Builder中单击TodoCell,转到 Attributes Inspector 标签,并验证标识符是否设置为TodoCell:

enter image description here

此外,请确保已将tableView和todoText UILabel确实连接到了代码。我看到您在这些项目上有@IBOutlets,但是如果您是从教程中复制和粘贴的,则有可能您键入了这些项目而从未真正连接它们。对于tableView和UILabel,您的IBOutlet旁边的灰色圆圈都应填写,如下所示:

enter image description here

如果为空,则可能没有连接,这可以解释问题。再次,我逐字复制并粘贴了您的代码,并根据上述建议进行了设置;我不认为reloadData()或设置节数可以解决问题(因为您的代码中没有这些节,并且可以正常工作)。

答案 1 :(得分:0)

您需要在更新数据源后重新加载表格视图:-

func addTodo() {
    let todo1 = Todo(text: "My first todo")
    let todo2 = Todo(text: "My second todo")
    todos = [todo1, todo2]
    todosTable.reloadData()
}

修改 通过查看JWC注释,我还注意到您尚未实现numberOfSection方法,因此还必须添加节委托方法的数量。

答案 2 :(得分:0)

您要在创建array之后将数据添加到tableView

更改此行:

var todos: [Todo] = []

var todos: [Todo]! {
    didSet {
        self.todosTable.reloadData()
    }
}

numberOfRowsInSection中的

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard (todos != nil) else {
        return 0
    }
    return todos.count
}

答案 3 :(得分:0)

您可以使用此

func addTodo() {
   let todo1 = Todo(text: "My first todo")
   let todo2 = Todo(text: "My second todo")
   todos = [todo1, todo2]
   DispatchQueue.main.async {
      self.todosTable.reloadData()
   }
}

这可能对您有帮助