UITableView 从其他 Viewcontroller 添加行

Posted

技术标签:

【中文标题】UITableView 从其他 Viewcontroller 添加行【英文标题】:UITableView add row from other Viewcontroller 【发布时间】:2018-05-29 15:32:55 【问题描述】:

我有两个视图控制器,一个带有 3 个表视图,另一个控制器我有一个 uitextfield,在文本字段中输入的文本我想将它添加到另一个视图控制器中名为 ScheduleTableView 的表视图之一。 这是我的代码,但在 vc.ScheduleTableView.beginUpdates() 处展开可选值时意外发现 nil 错误

@IBAction func addButtonTapped(_ sender: YTRoundedButton) 
   self.performSegue(withIdentifier: "secondvc", sender: self)



override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier  == "secondvc" 
        print(TitleTextField.text!)

        let vc = segue.destination as! GrowthMainViewController

        vc.ScheduleArray.append(TitleTextField.text!)
        let indexPath = IndexPath(row: vc.ScheduleArray.count - 1, section: 0)
        vc.ScheduleTableView.beginUpdates()
        vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)
        vc.ScheduleTableView.reloadData()
        vc.ScheduleTableView.endUpdates()



        TitleTextField.text = ""
        view.endEditing(true)

       

【问题讨论】:

我也试过只在按下按钮时调用一个函数并更新另一个视图中的 tableview 但没有工作 检查更新的代码,但我仍然有同样的错误 与您的问题无关,但请注意变量和函数名称应以小写字母开头。类名以大写字母开头。 我希望视图控制器在第一个视图中的按钮被按下时更新,所以我应该在哪里将代码放在第二个视图中而不使用vc.AddSchedule() 就像你对我说的那样,我使用 let vc = segue.destination as! GrowthMainViewController vc.ScheduleTitle = TitleTextField.text! 将数据传递到另一个视图,但在另一个视图中,我如何知道在第一个视图中按下按钮后才能更新视图 【参考方案1】:

解决方法是改变声明数组的位置(单例对此很好),并删除不必要的插入、更新、重新加载等。

numRowsInSection 方法然后调用 scheduleArray.count 显示所有对应的数据。

之前:

@IBAction func addButtonTapped(_ sender: YTRoundedButton) 
   self.performSegue(withIdentifier: "secondvc", sender: self)



override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier  == "secondvc" 
        print(TitleTextField.text!)

        let vc = segue.destination as! GrowthMainViewController

        vc.ScheduleArray.append(TitleTextField.text!)
        let indexPath = IndexPath(row: vc.ScheduleArray.count - 1, section: 0)
        vc.ScheduleTableView.beginUpdates()
        vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)
        vc.ScheduleTableView.reloadData()
        vc.ScheduleTableView.endUpdates()



        TitleTextField.text = ""
        view.endEditing(true)

       

之后:

@IBAction func addButtonTapped(_ sender: YTRoundedButton) 
   self.performSegue(withIdentifier: "secondvc", sender: self)



override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier  == "secondvc" 

        guard let text = TitleTextField.text else  return 
        scheduleArray.append(text)
        TitleTextField.text = ""
        view.endEditing(true)

       

【讨论】:

【参考方案2】:

vc.ScheduleArray.count - 1 可能是负索引路径

试试这个

if (vc.ScheduleArray.count - 1 >= 0)
    vc.ScheduleTableView.insertRows(at: [indexPath], with: .automatic)

【讨论】:

这不是负索引路径,因为我的数组中有 4 个项目,我尝试 +1 仍然是同样的错误。 试过了,在vc.ScheduleTableView.beginUpdates()展开可选值时发现同样的错误为零 你应该在vc.ScheduleTableView.beginUpdates()添加一个断点,打印出TitleTextField.text!vc。有些东西是零并导致崩溃。您还应该尽可能避免使用 bang 运算符并将它们解包,nil 值是使应用程序崩溃的最简单方法 这会破坏学习如何调试的目的,不是吗? google 如何在控制台中添加断点和打印变量。它会让你的生活轻松一百倍 如果你还没弄明白,今晚我会帮你的【参考方案3】:

问题是您试图在准备函数中更新视图控制器。在该函数内部,视图被实例化,但它的 Outlets 尚未连接。

要解决该问题,请按以下步骤操作:

在这种方法上你应该首先更新你的模型:

@IBAction func addButtonTapped(_ sender: YTRoundedButton) 
   // update your model here

   self.performSegue(withIdentifier: "secondvc", sender: self)    

在您的目标视图控制器中,您应该处理此模型更改并重新加载表格视图的数据。

override func viewDidLoad() 
    self.tableView.reloadData()

【讨论】:

以上是关于UITableView 从其他 Viewcontroller 添加行的主要内容,如果未能解决你的问题,请参考以下文章

从 UITableView 中删除行会更改存储在其他行中的信息

UITableView 自定义单元格按钮从主视图中选择其他按钮?

从其他视图控制器加载 uitableview 时禁用/启用 uitableviewcell 的内容

UITableView自定义单元格按钮从主视图中选择其他按钮?

setNavigationBarHidden 在其他类中不起作用(Swift 3.0)

从控制器重新加载 UITableView