참고: 스택오버플로우
화면전환시 이벤트를 발생시키려면 생명주기를 활용해서 해당 이벤트를 실행시키면 된다.
하지만 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()
})
}
}
'iOS - 실무관련 > iOS' 카테고리의 다른 글
Designated Init / Convenience Init / Failable Init / Super.init / required init (0) | 2022.07.30 |
---|---|
label 행간 조정 (0) | 2022.07.05 |
Notification push 앱에서 알람 거부에서 허용으로 설정 (0) | 2022.06.14 |
Delegate 패턴 (0) | 2022.06.12 |
textView행간 조절, 정렬, 폰트, 폰트 사이즈 설정하기 (0) | 2022.06.08 |