我对这个很陌生。我在选择项目时遇到问题,并在特定索引单元格上发回 TableView (重新加载)。 场景:我有两个 View Controller ,都包含 TableView 。
FirstViewController:
我已经将来自 webservice 的数据显示到 Tableview 中,但在不同的操作类型上,我使用了 didSelectRow 函数,它向 ListViewController
显示项目选择。在 FirstViewController 中,主要模型是 Unit。
ListViewController:
简单的数据列表显示在 tableView 中以供选择。
问题: 是我如何从 ListViewController 中选择项目并将数据传递到 FirstViewController TableView ,该更改发生在特定单元格上,然后我必须发布具有更新值的值。如何重新加载 TableView 或模型?
型号:
struct Unit : Codable {
let sectionList : [SectionList]?
}
struct SectionList : Codable {
let title : String?
let items : [Item]?
}
struct Item : Codable {
let actionType : Int?
let textField : String?
let textValue : String?
let pickList: [SectionList]?
let multiSelect: Bool?
let selectedValue: [String]?
let version: Int?
let masterId: Int?
let itemValue: String?
}
更新的 FirstController:
class FirstViewController: UIViewControlller, ListDelegate {
var selectedIndex: Int?
var selectedSection: Int?
//Click event for navigation from FirstViewController to SecondViewController
@IBAction func BackButtonAction(_ sender: Any) {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
vc.delegate = self
self.navigationController?.pushViewController(vc, animated: true)
}
func listFunc(listValue: String) {
AppData?.sectionList?[selectedSection!].items?[selectedIndex!].textField = listValue
tableView.reloadData()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Add these two line in your code
selectedIndex = indexPath.row
selectedSection = indexPath.section
}
}
更新:ListViewController:
protocol ListDelegate {
func listFunc(listValue: String)
}
class SecondViewController: UIViewControlller {
var delegate: ListDelegate?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexPath = tableView.indexPathForSelectedRow
let currentCell = tableView.cellForRow(at: indexPath!)!
//print(currentCell.textLabel?.text as Any)
currentCell.accessoryType = .checkmark
delegate?.listFunc(listValue: currentCell.textLabel?.text ?? "")
self.navigationController?.popViewController(animated: true)
}
}
最佳答案
您有几个选项可以完成此操作。假设所选值是您必须传递的唯一值,那么使用闭包将是您可以做的最简单的事情。
1) 在 ListViewController
中声明一个包含您需要的类型的闭包:
`var didSelectItem : ((YourType, IndexPath) -> ())?`
2) 在 ListViewController
的 didSelectRow
方法中,使用闭包:
`self.didSelectItem?(yourDataSourceItemAtIndexpath, indexPath)`
3) 当您从 FirstViewController
中的 ListViewController
实例使用此闭包时,您将获得触发闭包的回调,例如:
let myListInstance = ListViewController()
myListInstance.didSelectItem = { selectedItem, selectedIndex in
//You'll get the selected item inside this block, do model updation here
}
用新值更新模型后,如果您只想在特定(更新的)索引处重新加载 tableView,您可以使用:
self.yourTableView.reloadSections(sections: IndexSet, with: UITableView.RowAnimation)
重新加载整个部分或..
self.yourTableView.reloadRows(at: [IndexPath], with: UITableView.RowAnimation)
重新加载一个部分中的行
(如果您同时执行多个更新,请记住,您必须在 self.yourTableView.beginUpdates()
和 self.yourTableView.endUpdates( )
)
注意:
在这些重新加载期间,您必须正确处理您的数据源,以确保在重新加载前后具有正确数量的行或部分,添加/减去您插入/删除的行/部分。否则,您的应用会崩溃!
如果您不想冒险,只需使用 yourTableView.reloadData()
重新加载整个表格即可
另请记住,还有其他方法可以跨 Controller 传递数据,这只是基于我假设您的用例的建议
关于ios - 从列表中选择并重新加载 Tableview Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100588/