如何在 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
    

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

【讨论】:

【参考方案2】:

您可以创建委托方法来重新加载数据。

protocol NewHomeDelegate: NSObjectProtocol 
func reloadData()

之后创建委托变量

weak var delegate: NewHomeDelegate? 

并从牙科视图控制器调用它。

调用该委托函数并刷新数据

【讨论】:

以上是关于如何在 Swift 中从 Detail ViewController 更新 tableview 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从 Firebase 接收数组

如何在 Swift 中从 CloudKit 中删除资产?

如何在 Swift 中从数组中删除一个元素

如何在 Swift 中从 NSDictionary 生成 JSON 数据

如何在 Swift 中从 alamofire 中提取数据? [复制]

如何在 Swift 中从 Facebook 获取用户名