source

프로그래밍 방식으로 Swift의 이전 View 컨트롤러로 돌아가기

ittop 2023. 5. 7. 11:49
반응형

프로그래밍 방식으로 Swift의 이전 View 컨트롤러로 돌아가기

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

이제 사용자가 셀을 탭하면 이전 페이지로 다시 이동합니다.

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

그것을 하는 올바른 방법은 무엇입니까?

스위프트 3:

이전 보기 컨트롤러로 돌아가려는 경우

_ = navigationController?.popViewController(animated: true)

루트 보기 컨트롤러로 돌아가려는 경우

_ = navigationController?.popToRootViewController(animated: true)

내비게이션 컨트롤러를 사용하지 않을 경우 아래 코드를 사용하십시오.

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

요구 사항에 따라 설정할 수 있는 애니메이션 값입니다.

스위프트 3, 스위프트 4

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

navigationController는 없을 수 있으므로 선택 사항입니다.

스위프트 3

제가 답이 늦을 수도 있지만 swift 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)
}

스위프트 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)

첫 번째 경우에는 스토리보드의 탐색 컨트롤러에 ViewController를 내장했는지 확인합니다.

5세 이상의 빠른

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

  • 이전 보기 컨트롤러로 돌아가기

     self.navigationController?.popViewController(animated: true)
    
  • 루트 보기 컨트롤러로 돌아가기

    self.navigationController?.popToRootViewController(animated: true)
    

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

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

당신이 제시한 경우.UIViewController에서.UIViewController를 들어 예를 들어...

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

간단히 전화하세요.dismiss함수:

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

Segue가 일종의 'Show' 또는 'Push'라면 "popViewController(애니메이션:Bool)"을 클릭합니다.아니면 segue가 일종의 "현재"라면 "해체"(애니메이션:Bool, 완료: (() -> Void)?" (UIViewController 인스턴스 포함)

스위프트 3의 경우 다음 코드 라인을 작성하면 됩니다.

_ = navigationController?.popViewController(animated: true)

이 제품은 저에게 적합합니다(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")
        }
      }
    }
}

시도: 이전 보기의 경우 다음을 사용합니다.

navigationController?.popViewController(animated: true)  

pop to root 이 코드를 사용합니다.

navigationController?.popToRootViewController(animated: true) 

TabView 컨트롤러를 마지막 보기로 사용하는 Swift 4.0 Xcode 10.0

마지막 ViewController가 TabViewController에 포함된 경우 아래 코드가 루트로 전송합니다.

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

그러나 마지막 보기(탭1, 탭2 또는 탭3 보기일 수 있음)로 되돌아가고 싶다면,아래 코드를 작성해야 합니다.

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

이것은 저에게 효과가 있습니다, 저는 제 탭뷰 중 하나 이후에 뷰를 사용하고 있었습니다 :)

스토리보드의 탐색 컨트롤러에 뷰 컨트롤러를 내장하는 방법과 관련된 질문은 다음과 같습니다.

  1. 다른 보기 컨트롤러가 있는 스토리보드 열기
  2. 탐색 컨트롤러를 시작할 컨트롤러 보기를 누릅니다.
  3. Xcode 상단에서 "Editor"를 누릅니다.
  4. -> 삽입 탭
  5. -> "내비게이션 컨트롤러"를 누릅니다.

저는 이 문제에 대한 다른 접근법을 제안하고 싶습니다.탐색 컨트롤러를 사용하여 보기 컨트롤러를 팝업하는 대신 언윈드 세그를 사용합니다.이 솔루션에는 몇 가지 중요한 이점이 있습니다.

  1. 오리진 컨트롤러는 대상에 대한 정보 없이 이전 컨트롤러뿐만 아니라 다른 대상 컨트롤러로 돌아갈 수 있습니다.
  2. 푸시 및 팝업 세구는 스토리보드에 정의되므로 보기 컨트롤러에 탐색 코드가 없습니다.

자세한 내용은 단계별 Segues 해제에서 확인할 수 있습니다.데이터를 다시 보내는 방법을 포함하여 이전 링크에서 사용 방법에 대해 더 잘 설명하지만, 여기서 간략하게 설명하겠습니다.

원본이 아닌 대상 보기 컨트롤러로 이동하여 해제된 세그먼트를 추가합니다.

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

Ctrl 키를 누른 상태에서 뷰 컨트롤러 자체에서 오리진 뷰 컨트롤러의 종료 아이콘으로 끕니다.

보기 컨트롤러에서 해제

조금 전에 만든 풀림 기능을 선택합니다.

풀림 기능 선택

해제된 세그먼트를 선택하고 이름을 지정합니다.

해제된 segue 이름 지정

오리진 뷰 컨트롤러의 아무 곳에나 가서 언윈드 세그를 호출합니다.

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

이 접근 방식은 내비게이션이 복잡해지기 시작하면 많은 이점을 얻을 수 있습니다.

이것이 누군가에게 도움이 되길 바랍니다.

이렇게 했어요.

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)
}

이전의 두 뷰 컨트롤러를 닫으려면 다음과 같이 popView 컨트롤러를 두 번 호출합니다.

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

내비게이션 컨트롤러의 "viewDidDisparen"에 코드를 작성하여 루트 페이지로 리디렉션할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/28760541/programmatically-go-back-to-previous-viewcontroller-in-swift

반응형