我是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
}
}
发布于 2018-09-18 20:21:01
我成功地使用了您的代码来成功地生成Todo行(在调用reloadData()
之后我没有使用addTodo()
);
在证明了您的代码确实有效之后,我相信您在Storyboard设置中有一个问题,比代码本身的问题更多。几点建议:
验证您的自定义单元格被子类为TodoCell。您可以通过在Interface中单击您的TodoCell来完成这一任务,在Identity检查选项卡中,验证您是否将此设置为TodoCell:
这可能不是问题,因为你的应用程序更有可能崩溃,如果你的细胞没有正确的子类。
验证已在Interface 中设置了单元格标识符。再次单击Interface中的TodoCell,转到Attributes检查选项卡,并验证标识符设置为TodoCell:
另外,一定要确保您已经将tableView和todoText UILabel实际连接到代码中。我看到您在这些项目上有@IBOutlet,但是如果您是从教程中复制和粘贴的,那么您可能输入了这些条目,但实际上从未将它们连接起来。对于IBOutlet和tableView,应该填充tableView和UILabel旁边的灰色循环,如下所示:
如果它是空的,您可能没有连接,这可以解释这个问题。再次,我逐字复制和粘贴了您的代码,并根据上面的建议设置了内容;我不认为reloadData()
或设置节数会帮助解决这个问题(因为您的代码没有它们,而且它正在处理我的部分)。
发布于 2018-09-18 20:13:39
更新数据源后,需要重新加载表视图:-
func addTodo() {
let todo1 = Todo(text: "My first todo")
let todo2 = Todo(text: "My second todo")
todos = [todo1, todo2]
todosTable.reloadData()
}
编辑我还注意到,通过查看JWC注释,您没有实现numberOfSection方法,因此还必须添加节委托方法的数量。
发布于 2018-09-18 21:06:24
在创建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
}
https://stackoverflow.com/questions/52397816
复制相似问题