ios - 从列表中选择并重新加载 Tableview Swift

标签 ios swift uitableview model didselectrowatindexpath

我对这个很陌生。我在选择项目时遇到问题,并在特定索引单元格上发回 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) 在 ListViewControllerdidSelectRow 方法中,使用闭包:

`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/

相关文章:

ios - 如何从 iOS8 启用客户端配置描述符的指示

ios - GADBannerView 固定在 UITableViewController 中的屏幕底部

arrays - 使用 array.sort 时出错

ios - 设备磁航向代码在 iOS 8 上不起作用

ios - 如何在 ScrollView 中制作一组按钮?

ios - iAd didFailToReceiveAdWithError 有时不工作,显示白框

swift - 找不到“iTunesLibrary/ITLibDefines.h”文件

swift - 当tableView滚动到最高点时更新它?

objective-c - 如何使我的图像可点击

ios - SpriteKit 游戏在 AppDelegate 中花费大量时间