如何在 Swift 中从 Detail ViewController 更新 tableview 数组
Posted
技术标签:
【中文标题】如何在 Swift 中从 Detail ViewController 更新 tableview 数组【英文标题】:How to update array of tableview from Detail ViewController in Swift 【发布时间】:2019-06-04 05:34:31 【问题描述】:在我的应用程序中,我的主屏幕在表格视图中显示电子邮件列表。单击任何电子邮件后,我们会重定向到电子邮件详细信息屏幕,我们可以在其中更新电子邮件的状态,例如争议、已付款和待处理,并将状态从未读更改为已读电子邮件。
在详细信息屏幕上更改电子邮件状态后,当我从详细信息视图弹出到电子邮件列表时,还希望在表格视图中更新该特定电子邮件的电子邮件列表。
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")
【问题讨论】:
Pass data back to previous VC using delegates and update custom cell的可能重复?? ""
和 ?? 0
的意义何在?要么删除这些,要么将所有属性更改为不可选。
@RajeshKumarR 我想从数组中更新特定线程 id 的其他值,然后仅重新加载电子邮件列表屏幕上的特定单元格
@RahulFate 也许这个可以帮助你***.com/a/55860994/10150796
@NikunjKumbhani 我坚持更新特定键的数组,而不是将值从 B 控制器传递到 A
【参考方案1】:
detailviewhen,选择表视图单元格执行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
。根据您在此视图控制器中的需要更新对象的值。返回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
。
【讨论】:
【参考方案2】:您可以创建委托方法来重新加载数据。
protocol NewHomeDelegate: NSObjectProtocol
func reloadData()
之后创建委托变量
weak var delegate: NewHomeDelegate?
并从牙科视图控制器调用它。
调用该委托函数并刷新数据
【讨论】:
以上是关于如何在 Swift 中从 Detail ViewController 更新 tableview 数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中从 NSDictionary 生成 JSON 数据