Как обновить массив табличных представлений из Detail ViewController в Swift - PullRequest
0 голосов
/ 04 июня 2019

В моем приложении у меня есть домашний экран, который показывает список адресов электронной почты в виде таблицы. После нажатия на любое электронное письмо мы перенаправлены на подробный экран электронного письма, где мы можем обновить статус электронного письма, например, спор, оплачено и ожидающее рассмотрения, а также изменить статус с непрочитанного на прочитанное.

После изменения статуса электронной почты на подробном экране также необходимо обновить список электронной почты в табличном представлении для этого конкретного электронного письма, когда я выхожу из подробного представления в список электронной почты.

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")
    }
}

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

detailvie Когда ячейка табличного представления выбрана, выполните переход или нажмите 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.

0 голосов
/ 04 июня 2019

Вы можете создать метод делегата для перезагрузки данных.

protocol NewHomeDelegate: NSObjectProtocol {
func reloadData()
}

после этого создайте переменную делегата

weak var delegate: NewHomeDelegate? 

и вызовите ее из контроллера стоматологического представления.

Вызовэта функция делегата и обновление данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...