Программно вернуться к 3-му последовательному предыдущему ViewController в Swift - PullRequest
0 голосов
/ 10 декабря 2018

Я видел слишком много тем о том, как вернуться к предыдущему контроллеру View, что имеет смысл, и его легко реализовать.Но в моем случае есть только один тип осложнений.Рассмотрим следующую ситуацию.

  • VC1 --Opens -> VC2: vc2 - это контроллер представления, который показывает форму.При правильном заполнении пользователь попадает в другой ВК.назовите его vC3
  • VC2 --Opens -> VC3: vc3 - это контроллер представления, который получает информацию о карте смахивания, и, если предоставленная информация верна, она переходит к VC4

  • VC3 - Открывается -> VC4: .

VC4 - это view-контроллер, который загружает все пользовательские контакты и отправляет информацию / данные этому выбранному контакту.Так далеко, это хорошо.теперь есть 2 условия: если отправляемые данные отправляются правильно, я должен вернуться обратно к VC1, а если данные не отправляются, то мне нужно вернуться обратно к vc2, чтобы снова получить информацию.

так что лучше всего справиться с этой ситуацией.Пожалуйста, предложите.

ОБНОВЛЕНИЕ:

Я использую контроллер панели вкладок, в этом контроллере под одним из этого просмотра, я открываю другой контроллер VIew из этого последовательно.Как из этого открытия VC2, который открывает VC3 и так далее ...

Вот как я показываю свой ViewController 2

let myVC2 = self.storyboard?.instantiateViewController(withIdentifier: "idMyVC2") as MyVC2 
myVC2.modalPresentationStyle = .fullScreen 
self.present(myVC2,animated : true) 

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете сделать по-разному, один из них, как показано ниже: -

Иерархия контроллеров представления должна быть такой: -

NavigationController -> VC1 -> VC2 -> VC3 -> VC4(используя push). Теперь используйте приведенный ниже код для изменения вашего контроллера

Если используется pop to root, используйте: -

for controller in self.navigationController!.viewControllers as Array {
    if controller.isKind(of: VC1) {
        self.navigationController!.popToViewController(controller, animated:    true)
        break
    }
}

, если для pop перейдите на VC3, просто pop to root.

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

Спасибо

0 голосов
/ 10 декабря 2018

Подключите это к игровой площадке и возитесь с ней:

import UIKit

protocol DismissDelegate: AnyObject {
    func dismissVC(_ presenting: Int)
}

class VC1: UIViewController, DismissDelegate {
    func dismissVC(_ presenting: Int) {
        guard presenting == 1 else {
            return
        }
        print("dismiss 2, 3, 4, 5")
    }
}
class VC2: UIViewController, DismissDelegate {
    weak var vc2Delegate: DismissDelegate?
    func dismissVC(_ presenting: Int) {
        guard presenting == 2 else {
            return vc2Delegate!.dismissVC(presenting)
        }
        print("dismiss 3, 4, 5")
    }
}
class VC3: UIViewController, DismissDelegate {
    weak var vc3Delegate: DismissDelegate?
    func dismissVC(_ presenting: Int) {
        guard presenting == 3 else {
            return vc3Delegate!.dismissVC(presenting)
        }
        print("dismiss 4, 5")
    }
}
class VC4: UIViewController, DismissDelegate {
    weak var vc4Delegate: DismissDelegate?
    func dismissVC(_ presenting: Int) {
        guard presenting == 4 else {
            return vc4Delegate!.dismissVC(presenting)
        }
        print("dismiss 5")
    }
}
class VC5: UIViewController {
    weak var vc5Delegate: DismissDelegate?
    func dismissStack(at presenting: Int) {
        vc5Delegate?.dismissVC(presenting)
    }
}

let vc1 = VC1()

let vc2 = VC2()
vc2.vc2Delegate = vc1

let vc3 = VC3()
vc3.vc3Delegate = vc2

let vc4 = VC4()
vc4.vc4Delegate = vc3

let vc5 = VC5()
vc5.vc5Delegate = vc4

vc5.dismissStack(at: 1) // prints: dismiss 2, 3, 4, 5
vc5.dimissStack(at: 2) // prints: dismiss 3, 4, 5

Настройка очень проста, каждый контроллер представления связан через делегата.Поскольку существует более одного контроллера представления, мы создали протокол.Этот протокол является просто методом, который принимает целочисленный аргумент, который является контроллером представления, который должен выполнить dismiss (контроллер представления представления).Затем, когда вы хотите выполнить отклонение, вызовите делегат (не обязательно из 5-го контроллера представления), укажите контроллер представления, и делегат пойдет по цепочке и проверит, является ли он представителем представления (еслиэто так, он отклонит все выше него) или нет (если это не так, он уйдет в отставку на один контроллер представления и повторит процесс).

VC5 имеет метод с именем dismissStack(at:), который позволяетвы вводите целое число в контроллере представления, в котором хотите отказаться.Поэтому, если вы отклоните в 2, то просмотр контроллеров 3, 4, 5 будет отклонен.Очевидно, что вы можете поместить этот метод и в другие контроллеры представления.

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