programing

Swift에서 ViewController를 해제하는 방법

codeshow 2023. 4. 17. 22:10
반응형

Swift에서 ViewController를 해제하는 방법

Controller를 호출해야 합니다.dismissViewController an IBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

시가의 랜덤 이미지

콘솔 출력에서 println 메시지를 볼 수 있었지만 ViewController는 해제되지 않습니다.뭐가 문제죠?

이미지를 보니 푸시를 사용하여 View Controller를 제시한 것 같습니다.

dismissViewControllerAnimated는, 의 ViewController 를 사용해 제시된 ViewController 를 합니다.

스위프트 2

navigationController.popViewControllerAnimated(true)

스위프트 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

당신의 문제에 대한 해결책이 있습니다.모드를 사용하여 보기를 표시하는 경우 이 코드를 사용하여 보기 컨트롤러를 해제하십시오.

스위프트 3:

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

또는

"밀어서" segue를 사용하여 보기를 표시하는 경우

self.navigationController?.popViewController(animated: true)

이렇게 하면 콘솔에 println 메시지가 표시되지 않을 수 있습니다.

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}

Swift 3.0 ~ 4.0 에서는, 다음의 조작을 간단하게 실시할 수 있습니다.

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

또는 내비게이션 컨트롤러에 있는 경우 "팝업"할 수 있습니다.

self.navigationController?.popViewController(animated: true)
  1. 해제할 보기를 Navigation Controller에 포함시킵니다.
  2. "Done"을 식별자로 하는 BarButton을 추가합니다.
  3. Done 버튼을 선택한 상태에서 Assistant Editor를 호출합니다.
  4. 이 단추에 대한 IBAtion 만들기
  5. 다음 행을 괄호에 추가합니다.

    self.dismissViewControllerAnimated(true, completion: nil)
    

용도:

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

다음 대신:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

Navigation Controller를 사용하지 않고 컨트롤러를 제시하면 제시된 컨트롤러의 메서드에서 다음 코드를 호출할 수 있습니다.

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

View Controller가 모듈식으로 표시되는 경우 옵션의 presenting View Controller가 0이 되지 않고 코드가 실행됩니다.

Apple 문서:

프레젠테이션 뷰 컨트롤러는 자신이 제시한 뷰 컨트롤러를 해제하는 역할을 합니다.

따라서 스스로 해고 방법을 호출하는 것은 잘못된 관행이다.

모달의 경우 다음 사항을 제시해야 합니다.

presentingViewController?.dismiss(animated: true, completion: nil)

지금까지의 경험에 근거해, UIViewController 에의 확장으로서 나를 해제하는 방법을 추가합니다.

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

이 하여 뷰 한다.UIViewController의 예를 , 다음과 같습니다." " " , " " " " :

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}

따라서 push presented viewController를 사용했기 때문에

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

따라서 View 컨트롤러를 해제하려면 이것을 사용하십시오.이 코드는 VC를 해제하는 버튼 동작으로 작성됩니다.

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }

Cancel 또는 Done에서 다른 VC로 segue를 생성하지 말고 이 코드를 버튼 @IBAtion으로만 작성하십시오.

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

현재 뷰 컨트롤러를 해제하고 이전 뷰 컨트롤러로 되돌리는 방법은 다음과 같습니다.Storyboard를 통해서만 가능합니다.

  1. 스토리보드 열기
  2. [취소] 버튼을 오른쪽 클릭하여 이전 뷰 컨트롤러로 드래그하여 이전 컨트롤러로 되돌립니다.
  3. 이제 오른쪽 클릭을 놓으면 취소 버튼에서 수행되는 몇 가지 작업을 볼 수 있습니다.
  4. 이제 목록에서 "팝오버 표시" 옵션을 선택하십시오.
  5. 이제 취소 버튼을 클릭하여 현재 보기를 해제할 수 있습니다.

이거 한 번 해봐, 나한테 잘 돼.

두 번째 방법 - 사용 -navigationController.popViewControllerAnimated(true)

행운을 빈다.

참고로 잘못된 뷰 컨트롤러를 해제하고 있을 수 있습니다.예를 들어, 다른 모달 위에 알림 상자 또는 모달이 표시되는 경우.(예를 들어 현재 모드 경보 위에 Twitter 게시물 경보가 표시될 수 있습니다).이 경우 해제를 두 번 호출하거나 언인드세그를 사용해야 합니다.

이것을 시험해 보세요.

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

부모 VC에서 현재 메서드를 사용하는 경우 이 함수를 호출하여 자녀 VC를 해제해야 합니다.

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

푸시 메서드를 사용하여 하위 VC를 호출하는 경우 하위 VC를 해제하려면 이 명령을 사용합니다.

self.navigationController?.popViewController(animated: true)

ViewController를 모듈식으로 표시하고 루트 ViewController로 돌아가려면 루트 ViewController로 돌아가기 전에 이 모듈식으로 표시된 ViewController를 해제해야 합니다. 그렇지 않으면 이 ViewController가 메모리에서 제거되지 않고 메모리 누수가 발생합니다.

Swift 3.0의 경우

표시된 뷰 컨트롤러를 해제하려면

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

Swift 4.1 및 Xcode 9.4.1의 경우

pushViewController를 사용하여 새 뷰 컨트롤러를 표시하는 경우 다음을 사용하십시오.

self.navigationController?.popViewController(animated: false)
@IBAction func back(_ sender: Any) {
        self.dismiss(animated: false, completion: nil)
    }

언급URL : https://stackoverflow.com/questions/24668818/how-to-dismiss-viewcontroller-in-swift

반응형