Как открыть встроенный контроллер segue от другого контроллера? - PullRequest
0 голосов
/ 19 сентября 2019

Я делаю приложение, следуя тому же подходу к дизайну этого приложения https://github.com/Bailig/SurveyApp.

В вышеупомянутом проекте GitHub контроллеры сконструированы таким образом, как общий ViewController с ContainerView внутри. А также этот общий ViewController является Embed Segue с First Controller или самой первой страницей.Представление контейнера заменяется для всех следующих экранов.
В вышеприведенном проекте есть страница с благодарностью на последнем, в моем приложении я поместил кнопку на странице с благодарностью.Я хочу снова открыть самую первую страницу нажатием кнопки со страницы благодарности.Как я могу сделать это из контроллера последней страницы / FourthController?

ViewController

class ViewController: UIViewController {

var currentController: UIViewController?
var pageIndex = 1
var survey = Survey()

@IBOutlet weak var backButton: UIButton!
@IBOutlet weak var nextButton: UIButton!
@IBOutlet weak var containerView: UIView!
@IBOutlet weak var progressLabel: UILabel!
@IBAction func nextTapped(_ sender: Any) {
    switch pageIndex {
    case 1:
        let nextController = storyboard?.instantiateViewController(withIdentifier: "SecondController")
        if let fromController = currentController, let toController = nextController as? SecondController {
            toController.survey = survey
            moveAndSizeChildControllers(fromController: fromController, toController: toController)
            pageIndex += 1
            setButtonAndProgressLabel()
        }
    case 2:
        let nextController = storyboard?.instantiateViewController(withIdentifier: "ThirdController")
        if let fromController = currentController, let toController = nextController as? ThirdController {
            toController.survey = survey
            moveAndSizeChildControllers(fromController: fromController, toController: toController)
            pageIndex += 1
            setButtonAndProgressLabel()
        }
    case 3:
        let nextController = storyboard?.instantiateViewController(withIdentifier: "FourthController")
        if let fromController = currentController, let toController = nextController as? FourthController {
            toController.survey = survey
            moveAndSizeChildControllers(fromController: fromController, toController: toController)
            pageIndex += 1
            setButtonAndProgressLabel()
        }
    default:
        break
    }
}
@IBAction func backTapped(_ sender: Any) {
    switch pageIndex {
    case 2:
        let nextController = storyboard?.instantiateViewController(withIdentifier: "FirstController")
        if let fromController = currentController, let toController = nextController as? FirstController {
            toController.survey = survey
            moveAndSizeChildControllers(fromController: fromController, toController: toController)
            pageIndex -= 1
            setButtonAndProgressLabel()
        }
    case 3:
        let nextController = storyboard?.instantiateViewController(withIdentifier: "SecondController")
        if let fromController = currentController, let toController = nextController as? SecondController {
            toController.survey = survey
            moveAndSizeChildControllers(fromController: fromController, toController: toController)
            pageIndex -= 1
            setButtonAndProgressLabel()
        }
    default:
        break
    }
}

@IBOutlet weak var backTapped: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    currentController = segue.destination
    if let firstController = currentController as? FirstController {
        firstController.survey = survey
    }
    setButtonAndProgressLabel()
}

func moveAndSizeChildControllers(fromController: UIViewController, toController: UIViewController) {
    fromController.willMove(toParentViewController: nil)

    toController.view.frame = containerView.bounds

    addChildViewController(toController)
    containerView.addSubview(toController.view)

    // animatin
    toController.view.alpha = 0
    UIView.animate(withDuration: 0.5, animations: { 
        toController.view.alpha = 1
        fromController.view.alpha = 0 
    }) { (completed) in
        fromController.view.removeFromSuperview()
        fromController.removeFromParentViewController()

        toController.didMove(toParentViewController: self)
        self.currentController = toController
    }
}
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Я бы лучше использовал шаблон делегирования .Это просто управлять и легко понять.

В верхней части FourthController после импорта необходимо добавить

protocol FourthControllerThankDelegate {
    func didTapYourButton()
}

, а затем добавить переменную внутри этого класса

class FourthController: UIViewController {

    weak var delegate: FourthControllerThankDelegate?
    ...
}

, затем вам нужно вызвать didTapYourButton () внутри вашего обработчика действия кнопки

@IBAction func thanksButtonTapped(_ sender: Any) {
    delegate?.didTapYourButton()
}

, затем внутри функции ViewController nextTapped: вам необходимо установить этот контроллер представления в качестве делегата для FourthController

case 3:
     ... // I have skipped code above 
     toController.delegate = self
     setButtonAndProgressLabel()
}

и, наконец, вам нужно обработать действие делегата

extension ViewController: FourthControllerThankDelegate {
    func didTapYoutButton {
        pageIndex = 2
        backTapped(self)
    }
}

После этого обработчик backTapped переместит вас на первую страницу.Это не лучший способ вернуться назад.Чтобы улучшить это, вы можете создать функцию «displayMeFirstPage» и переместить туда часть логики из случая backTapped (): 2 и вызвать ее внутри этого случая и внутри обработчика делегата.Есть много способов улучшить навигацию.Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

0 голосов
/ 19 сентября 2019

Вы можете управлять им с помощью уведомления

Добавить в ViewController (основной)

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(navigateToFirstPage), name:NSNotification.Name(rawValue:"NavigateToFirstPage") , object: nil)
}

@objc private func navigateToFirstPage() {

    pageIndex = 2
    self.backTapped(UIButton())
}

Добавить в вас четвертый ViewController

// This is your button from where you need to perform action
@IBAction func thanksButtonAction(_ sender: Any) {

     NotificationCenter.default.post(name: NSNotification.Name(rawValue:"NavigateToFirstPage"), object: nil)
}
...