[ Swift ] Delegate Pattern 사용해봅시다.

Zion·2021년 2월 16일

어려워서 외면했던 Delegate를 이제 피할 수 없게 됐습니다.
한번 해보죠!
다행히 도움을 주신분 덕분에 기능을 사용할 수 있게 됐습니다 ㅠㅠ 감사합니다.

제가 하고싶은건
모달뷰를 닫고 팝업을 띄우는 기능이 동시에 일어나는 뷰인데요.

처음에는 모달뷰 -> 팝업뷰 이런 순서로 흐름대로 짜봤는데? 안되더라구요?
그래서 도움! 을 요청하던 중 Delegate Pattern을 이용해보라는 답이 와서 적용해봤습니다.

BaseViewController

밑에 모달뷰도 띄우고, 팝업뷰도 띄우는 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)
        }
    }
}

CustomPopupView(Controller)

이건 기본 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)
    }
}

흐흐 한번 만들어보세요 .

profile
어제보다만 나아지는

0개의 댓글