ios - 如何在 Swift 中从 Detail ViewController 更新 tableview 数组

标签 ios swift uitableview

在我的应用程序中,我有一个主屏幕,它在 tableview 中显示电子邮件列表。单击任何电子邮件后,我们将重定向到电子邮件详细信息屏幕,我们可以在其中更新电子邮件的状态,例如争议、已付款和待处理,还可以将状态从未读更改为已读。

在详细信息屏幕上更改电子邮件状态后,当我从详细信息 View 弹出到电子邮件列表时,还希望更新该特定电子邮件的 TableView 中的电子邮件列表。

struct NewHomeModel {
var body: String?
var date : String?
var dispute: Int?
var fileStatus: Int?
var from: String?
var msg_id: String?
var paid: Int?
var pending: Int?
var subject: String?
var thread_id: String?
var unread : Int?
var nextToken : String?

init(jsonData: [String: Any]) {
    body = jsonData["body"] as? String ?? ""
    date = jsonData["date"] as? String ?? ""
    dispute = jsonData["dispute"] as? Int ?? 0
    fileStatus = jsonData["fileStatus"] as? Int ?? 0
    from = jsonData["from"] as? String ?? ""
    msg_id = jsonData["msg_id"] as? String ?? ""
    paid = jsonData["paid"] as? Int ?? 0
    pending = jsonData["pending"] as? Int ?? 0
    subject = jsonData["subject"] as? String ?? ""
    thread_id = jsonData["thread_id"] as? String ?? ""
    unread = jsonData["unread"] as? Int ?? 0
}}
 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if arrayData.count > 0 && arrayData.count > indexPath.row {
        let objemail = arrayData.object(at: indexPath.row) as? NewHomeModel

        let emailDetailVC = EmailDetailViewController()
        emailDetailVC.strThreadId = (objemail?.thread_id)!
        emailDetailVC.strTitle = (objemail?.subject)!
        emailDetailVC.homeModel = objemail
        self.navigationController?.pushViewController(emailDetailVC, animated: true)
    }else{
        print("array empty")
    }
}

最佳答案

detailvie当一个 TableView 单元格被选中时,执行 segue 或推送 EmailDetailViewController。将选定的 NewHomeModel 对象传递给 EmailDetailViewController

class MainViewController: UITableViewController {
    var arrayData:[NewHomeModel] = [NewHomeModel]()
    //...
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if arrayData.count > 0 && arrayData.count > indexPath.row {
            let objemail = arrayData[indexPath.row]

            let emailDetailVC = EmailDetailViewController()
            emailDetailVC.strThreadId = (objemail.thread_id)!
            emailDetailVC.strTitle = (objemail.subject)!
            emailDetailVC.homeModel = objemail
            emailDetailVC.callBack = { [weak self] objemail in
                self?.arrayData[indexPath.row] = objemail
                self?.tableView.reloadRows(at: [indexPath], with: .automatic)
            }
            self.navigationController?.pushViewController(emailDetailVC, animated: true)
        }else{
            print("array empty")
        }
    }
}

使用选定的 NewHomeModel 对象配置 EmailDetailViewController。根据您的需要在此 View Controller 中更新对象的值。当返回到 MainViewController 时,使用 callBack 闭包将更新后的对象传递给之前的 View Controller 。

class EmailDetailViewController: UIViewController {
    var strThreadId:String?
    var strTitle :String?
    var homeModel: NewHomeModel?
    var callBack: ((NewHomeModel)->Void)?
    override func viewDidLoad() {
        super.viewDidLoad()
        homeModel?.unread = 0
        //configure views with selectedModel
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if self.isMovingFromParent, let homeModel = homeModel {
            print("Going back to main view controller")
            callBack?(homeModel)
        }
    }
    func updateStatus() {
        homeModel?.dispute = 1
        homeModel?.paid = 1
        homeModel?.pending = 0
        homeModel?.unread = 0
    }
}

MainViewControllercallBack 闭包中替换数据源数组中的更新对象并重新加载 tableview

关于ios - 如何在 Swift 中从 Detail ViewController 更新 tableview 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437856/

相关文章:

ios - 无法编辑/删除 uitableview 中的顶行 - Swift

ios - 如何在播放时实现与歌曲对应的搜索?

ios - NSDateComponents 在模拟器上运行

ios - 如何在键是动态的 Swift 4 中为 JSON 编写 Decodable?

ios - 专为 Iphone 6 设计的调整大小应用程序可在 iphone 5s 中正确缩放

Swift - 使函数类型显式(在协议(protocol)中)

ios - 给定两组坐标,如何计算它们之间的距离?

ios - MTLModels 中的 MTLModels?

ios - Q. App Store 拒绝 5.1.1 数据收集

ios - 如何获取表格 View 单元格中每行字符串文本的高度?