【发布时间】:2022-01-01 10:59:25
【问题描述】:
我正在创建一个待办事项列表应用。我将内容保存到 Firebase 实时数据库中。 以下是我存储/保存数据的方式:
@objc func addToDatabase(){
taskTitle = titleTextField.text!
taskDescription = notesTextView.text
var tasks: [String: Any] = [:] // declaring empty dictionary
tasks["Description"] = taskDescription
tasks["Due Date"] = date_time
database.child("Tasks").child(taskTitle).setValue(tasks)
self.dismiss(animated: true)
}
下面是方法,我正在检索数据并将其显示在TableView:
所以一开始我会提取所有的孩子并将它们放入一个数组中。
func createArray() -> [Task] {
taskRef = Database.database().reference(withPath: "Tasks")
//getting values from db, storing them in an array.
refHandle = taskRef?.observe(DataEventType.value, with: { snapshot in
self.taskTitles.removeAll()
for taskSnapshot in snapshot.children {
let nodeA = taskSnapshot as! DataSnapshot
let keyA = nodeA.key
let theTask = Task(title: String(keyA))
self.taskTitles.append(theTask)
}
self.tableView.reloadData()
})
return taskTitles
}
之后,我希望用户能够点击单元格并打开一个新的导航控制器,并且该导航控制器的标题应该是他们点击的单元格的名称。例如:如果点击Buy Milk,导航栏标题应为Buy Milk。这是我尝试过的,但它似乎不起作用:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let row = taskTitles[indexPath.row]
let tc = TaskUpdateViewController(selectedItem: row)
tc.modalPresentationStyle = .fullScreen
//wrap the new view controller in a navigation controller (this adds the top bar)
let navigationController = UINavigationController(rootViewController: tc)
// so you can actually see the Create a Task text,
navigationController.navigationBar.barStyle = .default
present(navigationController, animated: true)
}
这里是TaskUpdateViewController:
private let selectedItem: Any?
init(selectedItem: Any?){
self.selectedItem = selectedItem
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//... more code....//
title = selectedItem as! String?
我得到的错误:
重要提示:
我之所以使用Any 类型,是因为数组中的项不是字符串。当我在控制台中执行一个简单的打印语句时,它会返回 [ToDoList.task] 作为数组中的元素。因此,使用Any 作为类型似乎可以正常工作并正确打印数组的内容。
这是应用程序保存数据、显示数据和崩溃的演示:
【问题讨论】: