【问题标题】:How to pass the cell title to new navigation controller?如何将单元格标题传递给新的导航控制器?
【发布时间】: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 作为类型似乎可以正常工作并正确打印数组的内容。


这是应用程序保存数据、显示数据和崩溃的演示:

【问题讨论】:

    标签: ios swift firebase


    【解决方案1】:

    当您尝试设置其delegate 时,您的应用程序崩溃了,因为notesTextViewnil。您需要等到调用 viewDidLoad 并加载视图之后再执行此操作。

    您打算从 xib/nib 文件加载视图,还是希望它位于情节提要中?如果您期望故事板,那么您创建视图控制器的方式将不起作用。您应该设置一个带有@IBSegueAction 函数的故事板segue 来创建您的视图控制器并在其上配置选定的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2020-06-24
      • 2011-11-30
      相关资源
      最近更新 更多