【问题标题】:App crashes when inserting new row in tableview in swift?快速在表格视图中插入新行时应用程序崩溃?
【发布时间】:2021-01-19 05:29:48
【问题描述】:

我一直在尝试在 tableview 中插入新行,但每当我尝试这样做时,它都会使应用程序崩溃。 我有两个视图控制器。第一个控制器有表格视图,第二个控制器有一些文本字段。我们从数组中的文本字段中添加一些值,然后在之前的 tablview 中显示这些值。第一次在 tableview 上打印值,但第二次崩溃(它应该添加一个新行并在该行上显示值)。

在第一个控制器中:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrObj.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "view") as! ViewCell
       
            cell.label.text = arrObj[indexPath.row].category!

在第二个控制器中:

let vc = self.storyboard?.instantiateViewController(identifier: "viewcontroller") as! viewcontroller
                   
             vc.arrobj.insert(KeyValues(date: textfeild.text!, category: textfeild.text!, amount: textfeild.text!, tax: textfeild!.text!), at: 0)
             vc.tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)// Error:  Unexpectedly found nil while implicitly unwrapping an Optional value
           self.navigationController?.pushViewController(vc, animated: true)

谁能告诉我哪里出错了?

【问题讨论】:

  • 我没有创建导致崩溃的数组结构全局。

标签: swift tableview


【解决方案1】:

问题是在控制器被实例化后,表视图没有(还)连接。

删除行以插入行

let vc = self.storyboard?.instantiateViewController(identifier: "viewcontroller") as! viewcontroller           
vc.arrobj.insert(KeyValues(date: textfeild.text!, category: textfeild.text!, amount: textfeild.text!, tax: textfeild!.text!), at: 0)    
self.navigationController?.pushViewController(vc, animated: true)

并在viewWillAppear 中的目标控制器中重新加载表格视图

func viewWillAppear(_ animated : Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}

插入动画行没有任何好处,因为您不会看到它

【讨论】:

  • 您的代码工作正常,但它不会插入新行,而是在 tableview 的同一行显示值。
  • reloadData() 在表格视图中显示数据源数组。由于控制器刚刚创建,因此只有一行,除非您在控制器中的 viewDidLoadviewWillAppear 之间的某个位置填充数据源数组。
  • 看不懂。你能举个例子解释一下吗?
  • 这是一个例子。 instantiateViewController 使用空数据源数组 arrobj 创建一个新的空白控制器 - 除非该数组填充在控制器内部。在呈现控制器之前,您插入一个对象,因此有 一个 对象,也就是一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多