在我的应用程序中,我有一个主屏幕,它在 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
}
}
在 MainViewController
的 callBack
闭包中替换数据源数组中的更新对象并重新加载 tableview
。
关于ios - 如何在 Swift 中从 Detail ViewController 更新 tableview 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437856/