Swift에서 ViewController를 해제하는 방법?


214

호출하여 ViewController를 신속하게 해제하려고합니다 dismissViewController.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")
}

segue의 무작위 이미지

콘솔 출력에서 ​​println 메시지를 볼 수 있지만 ViewController는 결코 닫히지 않습니다. 무엇이 문제 일 수 있습니까?


2
뷰 컨트롤러를 어떻게 소개 했습니까?
dasdom

segue- "show"를 설정하여 매핑을 수행했습니다. 첨부 된 스크린 샷을 참조하십시오.
rshankar

4
모달을 사용해보십시오. push를 사용하는 경우 탐색 컨트롤러의 pop 메소드를 사용하여 해제해야합니다.
dasdom

답변:


415

당신이 이미지에서 푸시를 사용하여 ViewController를 제시 한 것처럼 보입니다.

dismissViewControllerAnimated모달을 사용하여 발표 가까운 ViewControllers에 사용된다

스위프트 2

navigationController.popViewControllerAnimated(true)

스위프트 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
'세부 정보 표시'를 위해 어떻게해야합니까?
MoralCode

2
스위프트 2.2 navigationController 를 위해 ! .popViewControllerAnimated (true)
swiftBoy

7
들어 스위프트 3 !있는 navigationController .popViewController은 (애니메이션 : TRUE)
알렉스 트롯

175

귀하의 문제에 대한 해결책이 있습니다. 모달을 사용하여 뷰를 표시하는 경우이 코드를 사용하여 뷰 컨트롤러를 닫으십시오.

스위프트 3 :

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

또는

"push"segue를 사용하여보기를 제시하면

self.navigationController?.popViewController(animated: true)

1
고맙지 만 여전히 같은 결과이지만 ViewController를
닫지

4
OP가 사용한 방법과 어떻게 다른가요?
dasdom

30
내 질문에 대답하지 않으면 대화는 쓸모가 없습니다.
dasdom

_ = self.navigationController? .popViewController (애니메이션 : true)
valexa

19

이 작업을 수행하면 콘솔에 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")
  }    
}

1
stackoverflow.com/questions/30840235/... . 어떤 도움이라도, 제발? 나는 아직도 해결책을 찾을 수없는 사람들을 위해 오랫동안 붙어 있습니다
Thiha Aung

14

Swift 3.0 ~ 4.0에서는 이것을 함수에 입력하는 것만 큼 쉽습니다.

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

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

self.navigationController?.popViewController(animated: true)

pushViewController를 사용하고 있기 때문에 작동하지 않습니다. self.navigationController? .popViewController (animated : true) 만 작동합니다.
iOS

13
  1. 해제하려는보기를 NavigationController에 포함
  2. "완료"를 식별자로 사용하여 BarButton 추가
  3. 완료 버튼이 선택된 상태에서 어시스턴트 편집기를 호출하십시오.
  4. 이 버튼에 대한 IBAction을 만듭니다.
  5. 이 줄을 괄호 안에 추가하십시오 :

    self.dismissViewControllerAnimated(true, completion: nil)

13

사용하다:

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

대신에:

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

1
을 추가하다 ! 내비게이션 컨트롤러와 그것은 나를 위해 작동
Jason G

1
! @naturalc :있는 navigationController가 전무이며 넣을 경우, 응용 프로그램이 충돌합니다주의하십시오
jobima

8

내비게이션 컨트롤러없이 컨트롤러를 제시하는 경우 제시된 컨트롤러의 메소드에서 다음 코드를 호출 할 수 있습니다.

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

ViewController가 모달로 표시되면 선택적 presentingViewController가 nil이 아니고 코드가 실행됩니다.


당신은 내 하루를 구했다.
Shanu Singh

6

내 경험을 바탕으로 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)
   }
   ...
}

6

Apple 문서에서 :

제시하는 뷰 컨트롤러는 제시된 뷰 컨트롤러를 해제 할 책임이 있습니다.

따라서 해고를 불러오는 것은 나쁜 습관입니다. 자체에서 메소드를 입니다.

모달을 제시하는 경우해야 할 일은 다음과 같습니다.

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

4

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

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

3

다음은 현재보기 컨트롤러를 닫고 이전보기 컨트롤러로 다시 이동하는 한 가지 방법입니다. 스토리 보드를 통해서만이를 수행 할 수 있습니다.

  1. 스토리 보드 열기
  2. 취소 버튼을 마우스 오른쪽 버튼으로 클릭하고 이전 컨트롤러로 드래그하여 이전 컨트롤러로 다시 이동하십시오.
  3. 이제 오른쪽 클릭을 해제하면 취소 버튼에서 수행되는 작업을 볼 수 있습니다
  4. 이제 목록에서 "popover present"옵션을 선택하십시오
  5. 이제 취소 버튼을 클릭하여 현재보기를 닫을 수 있습니다

이것을 시도하십시오, 그것은 나와 함께 일하고 있습니다.

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

최고의 행운..


stackoverflow.com/questions/30840235/... . 어떤 도움이라도, 제발? 나는 아직도 해결책을 찾을 수없는 사람들을 위해 오랫동안 붙어 있습니다
Thiha Aung

3
이것은 잘못이다. 현재 뷰 위에 새 뷰 컨트롤러를 표시하는 대신 뷰를 닫지 않고 메모리 누수가 발생합니다. 앱 스토어에서 앱이 거부 될 가능성이 높습니다.
3366784

2

참고로 잘못된 뷰 컨트롤러를 닫을 수 있습니다. 예를 들어, 다른 모달 위에 경고 상자 나 모달이 표시되는 경우. (예를 들어, 현재 모달 경고 위에 트위터 게시 경고가 표시 될 수 있습니다). 이 경우 dismiss를 두 번 호출하거나 unwind segue를 사용해야합니다.


1

ViewController를 모달로 표시하고 루트 ViewController로 돌아가려면 루트 ViewController로 돌아 가기 전에이 모달 표시 ViewController를 닫지 않도록주의하십시오. 그렇지 않으면이 ViewController가 메모리에서 제거되지 않아 메모리 누수가 발생합니다.


1

스위프트 3.0

제시된 뷰 컨트롤러를 닫으려면

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

1

Swift 4.1 및 Xcode 9.4.1에서

pushViewController를 사용하여 새보기 컨트롤러를 제시하는 경우이를 사용하십시오.

self.navigationController?.popViewController(animated: false)

또 다른 사본 붙여 넣기 답변
J. Doe

1

이 시도:

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

"dismissViewController"라는 메서드는 단일 매개 변수 만 사용합니다.이 매개 변수는 이전 뷰로 애니메이션을 표시하지 않는 것처럼 보일 것입니다. 이것이 가장 간단한 솔루션입니다.
cassiodiego

0

이 코드는 버튼 동작으로 작성되어 해제됩니다.

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

1
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 귀하의 코드 제안 이유를 모를 수도 있습니다.
DimaSan


0

상위 VC에서 present 메소드를 사용하는 경우이 함수를 호출하여 하위 VC를 해제해야합니다.

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

푸시 방법을 사용하여 자식 VC를 호출하는 경우 자식 VC를 해제하려면 다음을 사용하십시오.

self.navigationController?.popViewController(animated: true)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.