Как включить leftBarButtonItem из другого ViewController?

#ios #iphone #swift #swift3 #viewcontroller

#iOS #iPhone #swift #swift3 #viewcontroller

Вопрос:

Когда я нажимаю кнопку левой панели на MessageController, я устанавливаю для нее значение false. Затем я представляю PopUpViewController и при нажатии кнопки запускается функция removeAnimate(). И в этой функции я хотел бы установить для кнопки левой панели MessageController значение IsEnabled равным true. Я пробовал, но это не работает. Может кто-нибудь помочь?

 class PopUpViewController: UIViewController {
...
override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.black.withAlphaComponent(0.8)
    self.showAnimate()
}
func showAnimate()
{
    view.backgroundColor = UIColor.black.withAlphaComponent(0.8)
    self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
    self.view.alpha = 0.0;
    UIView.animate(withDuration: 0.25, animations: {
        self.view.alpha = 1.0
        self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
    });
}
func removeAnimate()
{
 let messagView = MessageController()
    UIView.animate(withDuration: 0.25, animations: {
        self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
        self.view.alpha = 0.0;
        }, completion:{(finished : Bool)  in
            if (finished)
            {
                self.view.removeFromSuperview()
                messagView.navigationItem.leftBarButtonItem?.isEnabled = true
            }
    });
}
lazy var cancleButton: UIButton = {
    let button = UIButton(type: .system)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.setTitle("Cancel", for: UIControlState())
    button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
    button.tintColor = .white
    button.addTarget(self, action: #selector(removeAnimate), for: .touchUpInside)
    return button
}()
}
  

MessageViewController

 class MessageController: UITableViewController {
override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(preformSettings))
}
func preformSettings(){

    let popViewController =  PopUpViewController()
    self.addChildViewController(popViewController)
    popViewController.view.frame = self.view.frame
    self.view.addSubview(popViewController.view)
    popViewController.didMove(toParentViewController: self)
    navigationItem.leftBarButtonItem?.isEnabled = false
}

}
  

Комментарии:

1. Как вы переходите от MessageController к PopUpViewController ?

2. @Mr.Bistra в функции preformSettings()

3. Это означает отсутствие перехода?

Ответ №1:

Вы можете использовать протоколы. Напишите протокол

 protocol PopViewControllerDelegate: class {
     func enableBackButton()
}
  

В PopUpViewController создайте объект этого протокола.

 class PopUpViewController: UIViewController {
    var delegate: PopViewControllerDelegate?
    ....

    func removeAnimate() {
       ...
       delegate?.enableBackButton()
    }

}
  

В MessageController реализован этот протокол.

 class MessageController: UITableViewController {

   func preformSettings(){
       let popViewController =  PopUpViewController()
       popViewController.delegate = self
       self.addChildViewController(popViewController)
       ....
   }

}

extension MessageController: PopViewControllerDelegate {
    func enableBackButton() {
        navigationItem.leftBarButtonItem?.isEnabled = true
    }
}
  

Комментарии:

1. popViewController.delegate = self Не может присвоить свойству ‘delegate’ значение let constant, даже если я изменю let popViewController = PopUpViewController() на значение var

2. внесите delegate в PopViewController var, как показано.