[iphone] 탐색 스택에서 뷰 컨트롤러 제거

5 개의 UIViewController가있는 탐색 스택이 있습니다. 다섯 번째 뷰 컨트롤러에서 버튼을 클릭하여 스택에서 세 번째 및 네 번째 뷰 컨트롤러를 제거하고 싶습니다. 이것이 가능합니까? 그렇다면 어떻게?



답변

이 코드를 사용하고 즐기십시오.

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];

// [navigationArray removeAllObjects];    // This is just for remove all view controller from navigation stack.
[navigationArray removeObjectAtIndex: 2];  // You can pass your index here
self.navigationController.viewControllers = navigationArray;
[navigationArray release];

이것이 당신을 도울 것입니다.

편집 : 스위프트 코드

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray


답변

먼저 배열의 모든 뷰 컨트롤러를 가져온 다음 해당 뷰 컨트롤러 클래스를 확인한 후 원하는 컨트롤러를 삭제할 수 있습니다.

다음은 작은 코드입니다.

NSArray* tempVCA = [self.navigationController viewControllers];

for(UIViewController *tempVC in tempVCA)
{
    if([tempVC isKindOfClass:[urViewControllerClass class]])
    {
        [tempVC removeFromParentViewController];
    }
}

나는 이것이 당신의 일을 더 쉽게 만들 것이라고 생각합니다.


답변

Swift 3 및 4/5

self.navigationController!.viewControllers.removeAll()

self.navigationController?.viewControllers.remove(at: "insert here a number")

스위프트 2.1

모두 제거:

self.navigationController!.viewControllers.removeAll()

색인에서 제거

self.navigationController?.viewControllers.removeAtIndex("insert here a number")

removeFirst, range 등과 같은 더 많은 가능한 작업이 있습니다.


답변

스위프트 5 :

navigationController?.viewControllers.removeAll(where: { (vc) -> Bool in
    if vc.isKind(of: MyViewController.self) || vc.isKind(of: MyViewController2.self) {
        return false
    } else {
        return true
    }
})


답변

setViewControllersfrom 함수를 사용 UINavigationController하는 것이 가장 좋은 방법입니다. animated애니메이션을 활성화하는 매개 변수 도 있습니다 .

func setViewControllers(_ viewControllers: [UIViewController], animated: Bool)

질문에 대한 신속한 예

func goToFifthVC() {

    var currentVCStack = self.navigationController?.viewControllers
    currentVCStack?.removeSubrange(2...3)

    let fifthVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "fifthVC")
    currentVCStack?.append(fifthVC)

    self.navigationController?.setViewControllers(currentVCStack!, animated: true)
}

나는 같은 다른 방법을 시도했다 [tempVC removeFromParentViewController];. 그것은 이상한 행동을 만들고, @ robin-ellerkmann이보고 한 것처럼 팝업 될 때 여전히 표시되는 ViewController 탐색을 제거했습니다.


답변

스위프트 2.0 :

  var navArray:Array = (self.navigationController?.viewControllers)!
  navArray.removeAtIndex(navArray.count-2)
  self.navigationController?.viewControllers = navArray


답변

Swift 5, Xcode 11.3

탐색 스택에서 제거 할 뷰 컨트롤러를 지정하여이 방법이 간단하다는 것을 알았습니다.

extension UINavigationController {

    func removeViewController(_ controller: UIViewController.Type) {
        if let viewController = viewControllers.first(where: { $0.isKind(of: controller.self) }) {
            viewController.removeFromParent()
        }
    }
}

사용 예 :

navigationController.removeViewController(YourViewController.self)