Как отклонить предыдущий Viewcontroller после представления нового Viewcontroller с помощью Swift? - PullRequest
1 голос
/ 15 мая 2019

Мой сценарий, в моем проекте я поддерживаю три ViewController (Main, VC1 and VC2). В основном ViewController Я поддерживаю UIButton, Эта кнопка нажимает VC1, представляя контроллер вида модели. Снова, VC1 Я поддерживаю UIButton с действием, чтобы представить модель на VC2. После VC2 представления мне нужно отклонить VC1.

//  presenting ViewController
var presentingViewController: UIViewController! = self.presentingViewController

self.dismissViewControllerAnimated(false) {
      // go back to MainMenuView as the eyes of the user
      presentingViewController.dismissViewControllerAnimated(false, completion: nil)
}

Ответы [ 6 ]

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

Попробуйте это в действии кнопки закрытия VC2

var vc = self.navigationController?.presentingViewController
while vc?.presentingViewController != nil {
    vc = vc?.presentingViewController
}
vc?.dismiss(animated: true, completion: nil)
1 голос
/ 15 мая 2019

Вам нужно открыть vc2 из mainVC - для этого вам нужен метод делегата, который скажет mainVC закрыть текущий открытый vc (т.е. vc1) и в блоке успеха открыть vc2.

Фрагмент кода: -

отклонить (анимация: ложь) { // Открываем vc2 Настоящее (VC2) }

0 голосов
/ 15 мая 2019

Чтобы решить проблему, вы можете указать VC2, используя Main вместо VC1.

Мы можем получить ссылку на Main в VC1, используя

self.presentingViewController

Когда представлено VC2, отклонить VC1 в методе completionHandler из present(_:animated:completion:)

class Main: UIViewController {
    @IBAction func onTapButton(_ sender: UIButton) {
        let vc1 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "VC1")
        self.present(vc1, animated: true, completion: nil)
    }
}

class VC1: UIViewController {
    @IBAction func onTapButton(_ sender: UIButton) {
        let vc2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "VC2")
        vc2.view.backgroundColor = .blue
        self.dismiss(animated: false, completion: nil)
        self.presentingViewController?.present(vc2, animated: true, completion: nil)
    }
}

class VC2: UIViewController {

}

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

0 голосов
/ 15 мая 2019

Существует подарок (_: анимированный: завершение:) метод, который требует завершения.Внутри вы можете dismiss ваш VC1.

Ваш код будет выглядеть примерно так

@IBAction func ButtonTapped(_ sender: Any) {
    present(VC2, animated: true) {
        dismiss(animated: true, completion: nil)
    }
}
0 голосов
/ 15 мая 2019

В этом случае вам нужно вызвать dismiss от контроллера представления, на котором представлены ваши другие контроллеры представления (в вашем случае это Main).

Как вы уже указали в приведенном выше вопросе, Main представляет VC1 и VC1затем представляет VC2: затем вызов Main.dismiss (animated: true, завершение: nil) приведет к одновременному удалению VC1 и VC2.

Если у вас нет ссылки на корневой контроллер (Main), вы можете выполнить цепочкунесколько свойств представления ViewController для доступа к нему;Примерно так в верхнем контроллере (VC2):

presentingViewController?.presentingViewController?.dismiss(animated: true)

Надеюсь, это поможет.

0 голосов
/ 15 мая 2019

Надеюсь, это сработает:

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

вы можете использовать протокол: -

В вашем протоколе настройки FirstViewController:

protocol FirstViewControllerProtocol {
    func dismissViewController()
}

class FirstViewController: UIViewController {

    var delegate:FirstViewControllerProtocol!

    override func viewDidLoad() {
        super.viewDidLoad()

        }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    @IBAction func goBack(sender: AnyObject) {
        self.dismissViewControllerAnimated(true) { 
            self.delegate!.dismissViewController()
        }
    }

Сейчас вваш MainViewController

class MainViewController: UIViewController, FirstViewControllerProtocol {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func goToFirstViewController(sender: AnyObject) {
    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(FirstViewController)) as! FirstViewController
    viewController.delegate = self
    self.presentViewController(viewController, animated: true, completion: nil)
}



//MARK: Protocol for dismiss
func dismissViewController() {
    if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(SecondViewController)){
        self.presentViewController(viewController, animated: true, completion: nil)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...