Контроллеры Pop 2 в контроллере Nav в Swift
Я нашел много способов вернуть 2 UIViewControllers
в UINavigationController
используя Objective-C, однако, когда я пытаюсь переключить это на Swift, кажется, что он не работает.
Каков наилучший UIViewController
вернуться к UIViewController
? Любое руководство будет оценено
Ответы
Ответ 1
Развернув мой комментарий, найдите второй последний контроллер представления в массиве viewControllers, а затем используйте popToViewController, чтобы избежать перезаписи всего стека контроллера представления.
Пример (предполагается, что контроллер навигации имеет более 1 контроллера представления):
func backTwo() {
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
}
Objective-C
NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:viewControllers[viewControllers.count - 3] animated:YES];
Ответ 2
Я написал расширение UIViewController (Swift 3+ ready)
Вы можете использовать следующее:
/// pop back n viewcontroller
func popBack(_ nb: Int) {
if let viewControllers: [UIViewController] = self.navigationController?.viewControllers {
guard viewControllers.count < nb else {
self.navigationController?.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
return
}
}
}
Использование:
self.popBack(3)
Бонус отклоняется к определенному диспетчеру просмотра
/// pop back to specific viewcontroller
func popBack<T: UIViewController>(toControllerType: T.Type) {
if var viewControllers: [UIViewController] = self.navigationController?.viewControllers {
viewControllers = viewControllers.reversed()
for currentViewController in viewControllers {
if currentViewController .isKind(of: toControllerType) {
self.navigationController?.popToViewController(currentViewController, animated: true)
break
}
}
}
}
Использование:
self.popBack(toControllerType: MyViewController.self)
Ответ 3
Вы можете динамически вставлять несколько контроллеров просмотра (swift 2.0)
let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
for aviewcontroller : UIViewController in allViewController
{
if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)
{
self.navigationController?.popToViewController(aviewcontroller, animated: true)
}
}
Ответ 4
user5320485 ответ в swift3
let viewControllers = self.navigationController!.viewControllers as [UIViewController];
for aViewController:UIViewController in viewControllers {
if aViewController.isKind(of: AdCreateViewController.self) {
_ = self.navigationController?.popToViewController(aViewController, animated: true)
}
}
Ответ 5
Версия расширения @Maximelc для Swift 4 UINavigationController:
extension UINavigationController {
func popBack(_ nb: Int) {
let viewControllers: [UIViewController] = self.viewControllers
guard viewControllers.count < nb else {
self.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
return
}
}
/// pop back to specific viewcontroller
func popBack<T: UIViewController>(toControllerType: T.Type) {
var viewControllers: [UIViewController] = self.viewControllers
viewControllers = viewControllers.reversed()
for currentViewController in viewControllers {
if currentViewController .isKind(of: toControllerType) {
self.popToViewController(currentViewController, animated: true)
break
}
}
}
}
Ответ 6
Я сделал помощник, чтобы сделать это легко:
import Foundation
import UIKit
class NavigationHelper {
static func back(number: Int, from viewControlller : UIViewController) {
let viewsBack = number + 1
let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
}
static func back(number: Int, from viewControlller: UITableViewController) {
let viewsBack = number + 1
let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
}
}
Например, в вашем ViewController
вы можете использовать NavigationHelper.back(number: 1, from: self)
Ответ 7
Вот еще одна, немного "надежная" версия:
extension UINavigationController {
func popBack(_ count: Int) {
guard count > 0 else {
return assertionFailure("Count can not be a negative value.")
}
let index = viewControllers.count - count - 1
guard index > 0 else {
return assertionFailure("Not enough View Controllers on the navigation stack.")
}
popToViewController(viewControllers[index], animated: true)
}
}