Как обновить View родительского Viewcontroller после того, как модальный Viewcontroller исчез - PullRequest
0 голосов
/ 17 мая 2019

У меня есть UIBarButtonItem, который я хочу обновить по значению модального viewController, когда он был отклонен. В настоящий момент я могу сделать это только путем получения текущего видимого viewController, который я не хочу.Есть ли способ обновить родительский viewController после увольнения модального.

class HomeViewController: UIViewController {

    @IBOutlet weak var accountButton: UIBarButtonItem!

    override func viewWillAppear(_ pAnimated: Bool) {
        super.viewWillAppear(pAnimated)
        self.accountButton.title = User.current!.firstName
   }

@IBAction func accountButton(_ pSender: UIBarButtonItem) {
        let editUserAccountVC = UIStoryboard.fs_instantiateFromStoryboard("Main", identifier: "EditUserAccountViewController") as! EditUserAccountViewController
        let navVC = UINavigationController(rootViewController: editUserAccountVC)
        navVC.view.tintColor = self.view.tintColor
        self.present(navVC, animated: true)
       }
   }
}

Это модал, который отклоняется после редактирования

class EditUserAccountViewController: UIViewController {

    var firstName: String?

    @IBAction func saveButton(_ sender: Any) {
        self.dismiss(animated: true) {
            if let thePresentedViewController = self.presentingViewController as? HomeViewController {
                thePresentedViewController.accountButton.title = self.firstName
            }
        }    
    }
}

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Я думаю, что вы должны хранить ссылку на родительский контроллер в экземпляре модального контроллера.Вы можете сделать это более общим с протоколами.Объявите следующее protocol:

protocol AccountButtonProvider: AnyObject {
    var accountButtonTitle: String? { set get }
}

AnyObject требуется для объявления ссылки на AccountButtonProvider как weak.Полагаю, вам это понадобится, чтобы избежать утечек памяти.

Сделать HomeViewController соответствующим AccountButtonProvider:

extension HomeViewController: AccountButtonProvider {
    var accountButtonTitle: String? {
        set {
            accountButton.title = newValue
        }
        get {
            return accountButton.title
        }
    }
}

Затем добавьте следующее свойство в EditUserAccountViewController:

weak var accountButtonProvider: AccountButtonProvider?

Инициализируйте это свойство перед тем, как представить EditUserAccountViewController.Для этого добавьте editUserAccountVC.accountButtonProvider = self к accountButton(_:):

@IBAction func accountButton(_ pSender: UIBarButtonItem) {
    let editUserAccountVC = UIStoryboard.fs_instantiateFromStoryboard("Main", identifier: "EditUserAccountViewController") as! EditUserAccountViewController
    editUserAccountVC.accountButtonProvider = self
}

Вы также должны изменить saveButton(_:):

@IBAction func saveButton(_ sender: Any) {
    self.dismiss(animated: true) {
        self.accountButtonProvider?.actionButtonTitle = self.firstName
    }
}

Весь код в этом посте был протестирован в Xcode 10.2.1,Я использовал Swift 5.

1 голос
/ 17 мая 2019

Вы можете использовать closure для решения вашей проблемы.

1. Создать closure в EditUserAccountViewController

var handler: ((String?)->())?

2. Установите значение этого closure, когда EditUserAccountViewController представлено из HomeViewController

controller.handler = {(name) in
    self.accountButton.title = name
}

3. Вызов closure, когда EditUserAccountViewController отклоняется при нажатии saveButton

self.dismiss(animated: true) {
    self.handler?(self.firstName)
}

Скомпилированный код:

class HomeViewController: UIViewController {
    @IBOutlet weak var accountButton: UIBarButtonItem!

    @IBAction func openEditUserAccountVC(_ sender: Any) {
        if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "EditUserAccountViewController") as? EditUserAccountViewController {
            controller.handler = {(name) in
                self.accountButton.title = name
            }
            self.present(controller, animated: true, completion: nil)
        }
    }
}

class EditUserAccountViewController: UIViewController {
    var firstName: String?
    var handler: ((String?)->())?

    @IBAction func saveButton(_ sender: Any) {
        self.dismiss(animated: true) {
            self.handler?(self.firstName)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...