어려워서 외면했던 Delegate를 이제 피할 수 없게 됐습니다.
한번 해보죠!
다행히 도움을 주신분 덕분에 기능을 사용할 수 있게 됐습니다 ㅠㅠ 감사합니다.
제가 하고싶은건
모달뷰를 닫고 팝업을 띄우는 기능이 동시에 일어나는 뷰인데요.
처음에는 모달뷰 -> 팝업뷰 이런 순서로 흐름대로 짜봤는데? 안되더라구요?
그래서 도움! 을 요청하던 중 Delegate Pattern을 이용해보라는 답이 와서 적용해봤습니다.
밑에 모달뷰도 띄우고, 팝업뷰도 띄우는 BaseViewController입니다.
이 안에는 누르면 모달뷰가 올라오는 버튼을 넣어줄거에요.
class ViewController: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var checkLabel: UILabel!
@IBOutlet weak var presentPopUpButton: UIButton!
// MARK: - LifeCycle
override func viewDidLoad() {
super.viewDidLoad()
configureVC()
}
// MARK: - Selector
@objc func presentPopUpButtonHandler() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let customPopUp = storyboard.instantiateViewController(withIdentifier: "CustomPopUp") as? CustomPopUp else { return }
customPopUp.delegate = self
customPopUp.modalPresentationStyle = .custom
customPopUp.modalTransitionStyle = .crossDissolve
present(customPopUp, animated: true, completion: nil)
}
// MARK: - Helper
func configureVC() {
presentPopUpButton.addTarget(self, action: #selector(presentPopUpButtonHandler), for: .touchUpInside)
}
}
// MARK: - CustomPopUpDelegate
extension ViewController: CustomPopUpDelegate {
func pressOkButton() {
let alert = UIAlertController(title: "Alert", message: "This is Alert", preferredStyle: .alert)
let okAction = UIAlertAction(title: "ok", style: .default) { _ in
DispatchQueue.main.async { [weak self] in
self?.checkLabel.text = "After Alert"
}
}
let cancelAction = UIAlertAction(title: "cancel", style: .cancel)
alert.addAction(cancelAction)
alert.addAction(okAction)
DispatchQueue.main.async { [weak self] in
self?.present(alert, animated: true, completion: nil)
}
}
}
이건 기본 alert뷰 말고 custom으로 만들어쓸 PopupView에요.
우리가 이 팝업뷰에서 처리한 일을 다음에 ViewController에 띄울꺼잖아요?
그래서 우린 protocol을 사용할거에요.
protocol은 음... 공용 함수 주머니죠(저는 이렇게 이해하고 있지만 나중에 자세히 공부할게요)
우리가 이 팝업뷰에서 처리하고 베이스뷰컨트롤러에서 처리할 일들을 여기다 적어줄거에요.
protocol CustomPopUpDelegate: class {
func pressOkButton()
}
CustomPopupView의 OK버튼을 누르면 그 다음일은 BaseViewController가 처리해줄겁니다.
class CustomPopUp: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var cancelButton: UIButton!
@IBOutlet weak var okButton: UIButton!
// MARK: - Properties
weak var delegate: CustomPopUpDelegate?
// MARK: - LifeCycle
override func viewDidLoad() {
super.viewDidLoad()
configurePopUp()
}
// MARK: - Selector
@objc func cancelButtonHandler() {
dismiss(animated: true, completion: nil)
}
@objc func okButtonHandler() {
delegate?.pressOkButton()
dismiss(animated: true, completion: nil)
}
// MARK: - Helper
func configurePopUp() {
cancelButton.addTarget(self, action: #selector(cancelButtonHandler), for: .touchUpInside)
okButton.addTarget(self, action: #selector(okButtonHandler), for: .touchUpInside)
}
}
흐흐 한번 만들어보세요 .