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自定义单元格按钮从主视图中选择其他按钮?