我是iOS和Swift的新手,我试图通过创建一个简单的Todo应用程序来学习一些知识。我遇到的问题是,无论我如何实现代码(接续多个教程)和情节提要,数据都不会显示,并且自定义单元格也不会自定义(即使我已自定义,它看起来也像默认单元格一样)它)。我已经连接了delegate
和dataSource
编辑:我已经分配了重用标识符
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
}
}
答案 0 :(得分:5)
我成功地使用您的代码成功生成了您的Todo行(调用reloadData()
后我没有addTodo()
)
已经证明您的代码可以正常工作,这使我相信您在Storyboard设置中的某个地方比在代码本身中更容易遇到问题。一些建议:
验证您的自定义单元是否被分类为TodoCell 。您可以通过在Interface Builder中单击TodoCell来执行此操作,然后在 Identity Inspector 标签中,确认已将此设置为TodoCell:
这可能不是问题,因为如果单元的分类不正确,您的应用很可能会崩溃。
验证您已在Interface Builder中设置了单元格标识符。再次,在Interface Builder中单击TodoCell,转到 Attributes Inspector 标签,并验证标识符是否设置为TodoCell:
此外,请确保已将tableView和todoText UILabel确实连接到了代码。我看到您在这些项目上有@IBOutlets,但是如果您是从教程中复制和粘贴的,则有可能您键入了这些项目而从未真正连接它们。对于tableView和UILabel,您的IBOutlet旁边的灰色圆圈都应填写,如下所示:
如果为空,则可能没有连接,这可以解释问题。再次,我逐字复制并粘贴了您的代码,并根据上述建议进行了设置;我不认为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()
}
}
这可能对您有帮助