我正在创建一个由拆分视图控制器管理的主从视图应用程序。我正在通过segue函数从主视图控制器传递模型数据,并通过委托方法(从文本字段中获取数据并返回对象)从详细视图控制器返回模型数据。当视图控制器合拢时,这种方法很好用,但是当它们不合拢时,由于传回并保存信息的方式,我会得到不想要的行为。
我尝试发送回viewWillDisappear
上的信息,但是当两个视图都显示时,这是行不通的,因为您可以在视图之间单击而不会消失细节控制器的视图。目前,我正在尝试在textFieldShouldEndEditing
时调用委托函数来保存数据。但是,我只是发现如果我仍在编辑文本字段并单击表视图中的另一个单元格,则数据会保存在单击的单元格中,因为选定的索引会更改,然后调用委托函数。
Master View Controller中的保存功能:
func saveItem(item: Item) {
if let selectedIndexPath = tableView.indexPathForSelectedRow {
// Update existing item and reselect current row
items[selectedIndexPath.row] = item
tableView.reloadRows(at: [selectedIndexPath], with: .automatic)
tableView.selectRow(at: selectedIndexPath, animated: false, scrollPosition: UITableView.ScrollPosition(rawValue: 0)!)
}
}
DetailViewController中的textFieldShouldEndEditing:
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
let nameFieldString = nameField.text ?? "New Item"
// Initialize Item object
let newItem = Item(name: nameFieldString)
// Call protocol function to pass Item object to delegate
if delegate != nil {
delegate?.saveItem(item: newItem)
// Update the DetailViewController's item variable
detailItem = newItem
}
return true
}
我假设在实现拆分视图控制器时,必须有一种标准方法或简单方法在两个视图控制器之间传递信息。
与使用tableView.indexPathForSelectedRow
跟踪当前选定的项目相比,也许有更好的方法来保存对项目的编辑。或者使用更好的触发器(而不是textFieldShouldEndEditing
)来确定何时将详细信息视图中的编辑保存回主视图。
我想使用委托。任何指导将不胜感激。