#ios #swift #dismiss #presentviewcontroller
#iOS #быстрый #отклонить #presentviewcontroller #swift
Вопрос:
У меня есть 3 Viewcontrollers HomePageController
, ChangePasswordViewController
, PasswordChangedDoneController
в действии кнопки смены пароля на домашней странице я нажимаю на экран ChangePasswordViewController
.
let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChangePasswordViewController")as! ChangePasswordViewController
self.navigationController?.pushViewController(vc, animated: true)
Теперь я представляю экран ChangePasswordViewController
для PasswordChangedDoneController
.
let vc = self.storyboard?.instantiateViewController(withIdentifier: "PasswordChangedController")as! PasswordChangedDoneController
self.navigationController?.present(vc, animated: true, completion: nil)
теперь я хочу перейти к HomePageController
действию кнопки Gotit внутри PasswordChangedDoneController
.
Здесь я хочу удалить как push, так и present одновременно с помощью одного действия.
Ответ №1:
Вы можете использовать эту функцию для перехода к заданному типу класса контроллера
extension UIViewController {
/// like UIViewController.popToRoot
public func popToRoot() {
guard let navigationController = navigationController else { return dismiss(animated: true) }
navigationController.popToRootViewController(animated: true)
}
/// like UIViewController.popTo(:)
public func popTo(_ vc: UIViewController.Type, _ orPopToRoot: Bool = true) {
guard let navigationController = navigationController else { return popToRoot() }
let list = navigationController.viewControllers.reversed().filter { return $0.isKind(of: vc) }
guard let c = list.first else {
if orPopToRoot { self.popToRoot() }
else { self.popSelf(animated: true) }
return
}
navigationController.popToViewController(c, animated: true)
}
/// like UIViewController.popViewController
///
/// - Note: if can't found navigationController. will 'dismiss(animated:completion:)'
public func popSelf(animated: Bool) {
guard let navigationController = navigationController else { return dismissSelf(animated: animated) }
navigationController.popViewController(animated: animated)
}
/// like UIViewController.dismiss
public func dismissSelf(animated: Bool, completion: (() -> Void)? = nil) {
dismiss(animated: animated, completion: completion)
}
}
🙂
Комментарии:
1. ‘base’ — это пространство имен для меня, вы можете игнорировать его. а ‘popToRoot()’ — это «popToRootContoller» навигационного контроллера
2. Я не смог получить этот метод в представленном действии кнопки экрана.
3. вы можете добавить расширение для UIViewController и вызвать метод в методе выбора кнопки.
4. Я получаю эти ошибки, значение типа ‘UIViewController’ не имеет элемента ‘popToRoot’. Значение типа ‘UIViewController’ не имеет элемента ‘popSelf’