Swift: Как программно закрыть ViewController? - PullRequest
0 голосов
/ 03 июля 2019

У меня маленькая проблема. На моем главном контроллере вида я получил кнопку панели, которая открывает меню слайдов, которое представляет собой обычный контроллер вида, использующий слайд в переходе. В слайд-меню есть кнопка для открытия другого контроллера вида. Когда новый контроллер представления открыт, у вас есть возможность отменить, что отклоняет текущий контроллер представления. Проблема в том, что пользователь снова оказывается в представлении меню вместо контроллера основного представления. Был бы очень рад узнать, что я делаю не так:)

func openSupport() {
    guard  let creditViewContoller = storyboard?.instantiateViewController(withIdentifier: "support") as? CreditViewController else { return }
    present(creditViewContoller, animated: true)
}

@IBAction func buttonSupport(_ sender: UIButton) {
    let menuView = MenuViewController()
    menuView.dismiss(animated: true, completion: nil)
    openSupport()
    print("Tap on Support")
}

Ответы [ 2 ]

1 голос
/ 03 июля 2019

вы можете отключить просмотр контроллера просто используя

self.dismiss(animated: true, completion: nil)
0 голосов
/ 03 июля 2019

Рассмотрим

@IBAction func buttonSupport(_ sender: UIButton) {
    let menuView = MenuViewController()               // (1)
    menuView.dismiss(animated: true, completion: nil) // (2)
    openSupport()                                     // (3)
    print("Tap on Support")
}

Это:

  1. Создает новый MenuViewController, но никогда не представляет его;
  2. Вызывает dismiss на контроллере представления, который никогда не былпредставлены;и
  3. Вызывает openSupport из этого экземпляра MenuViewController (который никогда не отклонялся).

В итоге вы хотите, чтобы контроллер основного вида, который представил меню, выполнялПредъявление.Итак, контроллер представления меню должен:

  1. Определить протокол для него, чтобы информировать контроллер представления о переходе к следующей сцене:

    protocol MenuViewControllerDelegate: class {
        func menu(_ menu: MenuViewController, present viewController: UIViewController)
    }
    
  2. И затем контроллер представления меню может, когда он завершит отклонение, сказать своему делегату, что он должен представить:

    class MenuViewController: UIViewController {
        weak var delegate: MenuViewControllerDelegate?
    
        @IBAction func didTapSupport(_ sender: Any) {
            dismiss(animated: true) {
                guard let controller = self.storyboard?.instantiateViewController(withIdentifier: "support") else { return }
                self.delegate?.menu(self, present: controller)
            }
        }
    
        @IBAction func didTapCancel(_ sender: Any) {
            dismiss(animated: true)
        }
    }
    

Тогда контроллеру основного представления необходимо

  1. Обязательно установите delegate контроллера вида меню:

    class ViewController: UIViewController {
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let destination = segue.destination as? MenuViewController {
                destination.delegate = self
            }
        }
    }
    

    и

  2. Обязательно представьте видКонтроллер, о котором его попросил контроллер меню:

    extension ViewController: MenuViewControllerDelegate {
        func menu(_ menu: MenuViewController, present viewController: UIViewController) {
            present(viewController, animated: true)
        }
    }
    

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

...