본문 바로가기
iOS - 실무관련/iOS

dismiss를 하고 이벤트 발생 시키는 방법

by print_soo 2022. 6. 23.

참고: 스택오버플로우

 

화면전환시 이벤트를 발생시키려면 생명주기를 활용해서 해당 이벤트를 실행시키면 된다. 

하지만 dismiss를 사용하는 경우 생명주기를 거치지 않는다. (.FullScreen은 제외)

 

이런 상황에서 이벤트는 어떻게 발생시켜야할까? 

 

 

1.  첫번째 ViewController에 프로토콜을 정의한다. 

protocol ViewControllerDelegate: UIViewController  {
    func refresh()
}

 

 

2. 두번째 ViewController에 delgate를 만든다. 

weak var delegation: ViewControllerDelegate?

 

 

3. delegate = self를 통해서 delegate 지정

delegation = self

 

 

4. 프로토콜을 채택하고, 해당 프로토콜 내부에 있던 메소드가 실행되었을 때 발생하는 이벤트를 작성해준다.

class NextViewController: UIViewController, ViewControllerDelegate {

    func refresh() {
        print("뒤로 갑니다.")
    }
    
    ...

}

 

 

5. dismiss의 completion에 해당 메소드를 호출해준다.

self.dismiss(animated: true, completion: {
            self.delegation?.refresh()
})

 

 

 

 

 

[전체코드]

// 첫번째 VC

import UIKit

protocol ViewControllerDelegate: UIViewController  {
    func refresh()
}

class ViewController: UIViewController {
   
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
    }
    
}
// 두번째 VC

import UIKit

class NextViewController: UIViewController, ViewControllerDelegate {
    
    func refresh() {
        print("뒤로 갑니다.")
    }
    
    weak var delegation: ViewControllerDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        delegation = self
        
    }
    
    @IBAction func back(_ sender: UIButton) {
        self.dismiss(animated: true, completion: {
            self.delegation?.refresh()
        })
    }
    
   

}