![](/img/trans.png)
[英]How to update cell in a tableView from array by using button in Swift?
[英]How to update array of tableview from Detail ViewController in Swift
在我的應用程序中,我有主屏幕,該屏幕在表格視圖中顯示電子郵件列表。 單擊任何電子郵件后,我們將重定向到電子郵件詳細信息屏幕,在該屏幕上我們可以更新電子郵件狀態(例如,爭議,已付款和未決),還可以將狀態從未讀更改為已讀電子郵件。
在詳細信息屏幕上更改電子郵件的狀態后,當我從詳細信息視圖彈出到電子郵件列表時,還希望在表視圖中針對該特定電子郵件更新電子郵件列表。
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當選擇了表格視圖單元格時,執行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")
}
}
}
配置EmailDetailViewController
與所選擇的NewHomeModel
對象。 根據需要在此視圖控制器中更新對象的值。 返回MainViewController
,使用callBack
閉包將更新后的對象傳遞給先前的視圖控制器。
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
。
您可以創建Delegate方法來重新加載數據。
protocol NewHomeDelegate: NSObjectProtocol {
func reloadData()
}
之后創建委托變量
weak var delegate: NewHomeDelegate?
並從牙科視圖控制器調用它。
調用該委托函數並刷新數據
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.