프로그래밍 방식으로 Swift의 이전 ViewController로 돌아갑니다.


211

버튼 클릭으로 사용자를 페이지로 보냅니다. 이 페이지는 UITableViewController 입니다.

이제 사용자가 셀을 탭하면 이전 페이지로 다시 밀고 싶습니다.

나는 비슷한 것에 대해 생각 self.performSegue("back")....했지만 이것은 나쁜 생각 인 것 같습니다.

올바른 방법은 무엇입니까?


13
self.navigationController? .popViewControllerAnimated (true)
Kalpesh

답변:


526

스위프트 3 :

이전 뷰 컨트롤러로 돌아가려면

_ = navigationController?.popViewController(animated: true)

루트 뷰 컨트롤러로 돌아가려면

_ = navigationController?.popToRootViewController(animated: true)

1
셀을 누를 때 어떻게 이전 컨트롤러로 데이터를 다시 보낼 수 있습니까? ? 우리는 (사실)에있는 navigationController .popViewControllerAnimated 사용하는 경우
JDDelgado

4
@JDDelgado 다음은 사용자에게 데이터를 다시 보내는 방법입니다. stackoverflow.com/questions/12561735/…
Mohamad Kaakati

36
스위프트 3의 경우.popViewController(animated: true)
Sasho

9
경고를 표시하려면 :_ = self.navigationController?.popToRootViewController(animated: true)
Andrew K

1
우리는 반환 값을 무시하고 있습니다. _ = 그것을위한 신속한 관습입니다.
Andrew K

53

스위프트 3 , 스위프트 4

if movetoroot { 
    navigationController?.popToRootViewController(animated: true)
} else {
    navigationController?.popViewController(animated: true)
}

navigationController는 선택 사항이 아니므로 선택 사항입니다.


@Vyacheslva "클로징에서 'seft'의 암시 적 사용, 캡처 의미론을 명시 적으로 만들기 위해 'self'사용"
Sandip Subedi

@SandipSubedi 사용 [weak self]self?.navigationController?.
Vyacheslav

이것은 유용했지만 탐색 기능을 사용하여 변수를 보내려고하지만 지금은 사용할 수 없습니다-사용 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? 했지만이를 사용할 때 사용할 수 없습니다
Saeed Rahmatolahi

navigationController를 추가하는 방법?
user25

@ user25 추가 하시겠습니까? 무슨 소리 야?
Vyacheslav

37

스위프트 3

나는 대답에 늦었을 수도 있지만 신속한 3의 경우 다음과 같이 할 수 있습니다.

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "< Back", style: .plain, target: self, action: #selector(backAction))

    // Do any additional setup if required.
}

func backAction(){
    //print("Back Button Clicked")
    dismiss(animated: true, completion: nil)
}

3
그것은 '완전히'정확하지 않습니다. 자체 탐색 기능이 포함 된 뷰 컨트롤러를 제공하고 뷰 컨트롤러를 푸시 한 후 해당 메서드를 사용 dismiss:하면 현재 뷰 컨트롤러뿐만 아니라 루트 뷰 컨트롤러도 닫히게되며 여기에서 요청한 것이 아닙니다.
Ernesto Fernandez

2
이 질문은 사용자에게 내비게이션 컨트롤러가 있는지 묻지 않았습니다. 이것은 내비게이션 컨트롤러가없는 경우 가장 간단하고 최상의 답변입니다. 이것은 실제로 받아 들여지는 대답이어야합니다.
드로이드 크리스

고마워 드로이드-안녕 ernestofndz, 당신은 rootVC도 해제 될 것이라고 말할 수도 있지만, 이것은 나와 함께 발생하지 않으며, currentVC 만 해제합니다. 항목을 프로그래밍 방식으로 추가 및 제거하고 동일한 접근법이 아닐 수도 있습니다 스토리 보드에 요소를 추가하는 일반적인 방법으로 .. 내가 틀렸다면 내 이해를 수정하십시오 ... 내가 이해 한 것은이 경우 뒤로 버튼이 필요하다는 것입니다. :)
Fullpower

어쩌면 u 약간의 소개를 추가 할 수 있습니다. 존재 때문에 dismiss & navigationController? .popViewController
marlonpya

dismiss(animated: true, completion: nil)회전 후 작동하지 않습니다!
user924

31

스위프트 4

이전 ViewController로 돌아가거나 되 돌리는 두 가지 방법이 있습니다.

  1. 첫 번째 경우 사용한 경우 : self.navigationController?.pushViewController(yourViewController, animated: true) 이 경우에 당신이 필요로 사용self.navigationController?.popViewController(animated: true)
  2. 두 번째 경우 사용한 경우 : self.present(yourViewController, animated: true, completion: nil) 이 경우에 당신이 필요로 사용self.dismiss(animated: true, completion: nil)

첫 번째 경우 스토리 보드의 navigationController에 ViewController를 내장했는지 확인하십시오.


19

당신이 제시하는 경우 UIViewController내에서 UIViewController즉 ..

// Main View Controller
self.present(otherViewController, animated: true)

간단히 dismiss함수를 호출하십시오 .

// Other View Controller
self.dismiss(animated: true)

self.dismiss(animated: true)-회전 후 작동하지 않음
user924

17

스위프트 5 이상

사례 1 : 내비게이션 컨트롤러와 함께 사용

self.navigationController?.popViewController(animated: true)

사례 2 : 현재보기 컨트롤러와 함께 사용

self.dismiss(animated: true, completion: nil)

11

Segue가 'Show'또는 'Push'종류이면 UINavigationController의 인스턴스에서 "popViewController (animated : Bool)"을 호출 할 수 있습니다. 또는 segue가 "present"인 경우 UIViewController의 인스턴스로 "dismiss (animated : Bool, complete : (()-> Void)?)"를 호출하십시오.


7

신속한 3의 경우 다음 코드 줄을 작성하면됩니다.

_ = navigationController?.popViewController(animated: true)

2

이것을보십시오 : 이전보기를 위해 이것을 사용하십시오 :

navigationController?.popViewController(animated: true)  

루트로 팝 다음 코드를 사용하십시오.

navigationController?.popToRootViewController(animated: true) 

2

마지막으로 TabViewController를 사용하는 Swift 4.0 Xcode 10.0

마지막 ViewController가 TabViewController에 포함되어 있다면 아래 코드는 루트로 당신을 보낼 것입니다 ...

navigationController?.popToRootViewController(animated: true)
navigationController?.popViewController(animated: true)

그러나 실제로 마지막보기로 돌아가려면 (Tab1, Tab2 또는 Tab3보기 일 수 있습니다.) 아래 코드를 작성해야합니다.

_ = self.navigationController?.popViewController(animated: true)

이것은 나를 위해 작동합니다. 내 TabView 중 하나 후에보기를 사용하고있었습니다 :)


1

스토리 보드의 viewController를 navigationController에 포함시키는 방법에 대한 질문 :

  1. 다른 viewController가있는 스토리 보드를 엽니 다.
  2. 내비게이션 컨트롤러를 시작하려는 viewController를 탭하십시오.
  3. Xcode 상단에서 "편집기"를 누릅니다
  4. -> 퍼가기
  5. -> "탐색 컨트롤러

1

이것은 나를 위해 일한다 (Swift UI)

struct DetailView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

  var body: some View {
      VStack {
        Text("This is the detail view")
        Button(action: {
          self.presentationMode.wrappedValue.dismiss()
        }) {
          Text("Back")
        }
      }
    }
}

0

나는 이렇게 했어

func showAlert() {
    let alert = UIAlertController(title: "Thanks!", message: "We'll get back to you as soon as posible.", preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
        self.dismissView()
    }))

    self.present(alert, animated: true)
}

func dismissView() {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

0

이 문제에 대한 또 다른 접근법을 제안하고 싶습니다. 탐색 컨트롤러를 사용하여보기 컨트롤러를 팝하는 대신 되감기 해제를 사용하십시오. 이 솔루션에는 몇 가지 중요한 장점이 있습니다.

  1. 출발지 제어기는 목적지에 대해 전혀 몰라도 이전 목적지만이 아닌 다른 목적지 제어기로 되돌아 갈 수 있습니다.
  2. 푸시 및 팝 세그는 스토리 보드에서 정의되므로 뷰 컨트롤러에 탐색 코드가 없습니다.

Unwind Segues Step-by-Step 에서 자세한 내용을 확인할 수 있습니다 . 방법은 이전 링크에서 데이터를 다시 보내는 방법을 포함하여 더 잘 설명되어 있지만 여기서는 간단한 설명을합니다.

1) 목적지 (원점이 아닌) 뷰 컨트롤러로 이동 하여 풀기 segue를 추가하십시오.

    @IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
        //let sourceViewController = unwindSegue.source
        // Use data from the view controller which initiated the unwind segue
    }

2) CTRL을 뷰 컨트롤러 자체 에서 원점 뷰 컨트롤러의 종료 아이콘으로 드래그 합니다.

뷰 컨트롤러에서 풀기

3) 몇 분 전에 방금 만든 해제 기능을 선택하십시오.

풀기 기능 선택

4) 풀기 segue를 선택하고 이름을 지정하십시오.

이름 풀기 segue

5) 원점 뷰 컨트롤러의 어느 곳으로 이동하여 unwind segue를 호출하십시오.

performSegue(withIdentifier: "unwindToContact", sender: self)

탐색이 복잡해지기 시작하면이 접근법이 많은 이점을 얻었습니다.

나는 이것이 누군가를 돕기를 바랍니다.


-3

탐색 된 컨트롤러의 "viewDidDisappear"에 코드를 작성하여 루트 페이지로 리디렉션 할 수 있습니다.

override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }


그러면 계층 구조에서 앞으로 이동하려는 경우에도 탐색 컨트롤러가 루트에 팝업됩니다.
bkSwifty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.