[Swift]ActionSheet-Protocol
코드 진행을 위한 디테일한 구현이 아닌 흐름을 기록했습니다. 😀

ActionSheet 📝

왜 프로토콜을 사용했을까?

  • ActionSheetLauncher.swift(NSObject)라는 파일을 만들었고, 우리가 실제로 클릭 이벤트를 받아야 할 부분은 TweetHeader 파일이다.
  • TweetHeader 파일은 TweetController 안에 헤더를 구성하는 파일이다.
    • TweetController(Controller) → UICollectionViewController
    • TweetHeader(View) → UICollectionReusableView
  • Controller안에 있는 View에 해당 이벤트가 존재해야하므로, View에서는 View 관련된 코드만 적어둬야 하는 MVVM 패턴이므로, Controller에서 대신 기능을 수행할 수 있도록 Protocol을 사용한다.

 

흐름 🌊

  • ActionSheetLauncer(Utils) 파일부터 살펴보자
class ActionSheetLauncher: NSObject {
    
    // MARK: - Properties
    
    private let user: User
    
    init(user: User) {
        self.user = user
        super.init()
    }
    
    // MARK: - Functinos
    
    func show() {
        print("DEBUG: Show action sheet for user \(user.username)")
    }
}
  • show() 라는 메서드엔 출력할 수 있는 print문이 하나 있는 상황이다.

  • TweetHeader(View)
protocol TweetHeaderDelegate: class {
    func showActinoSheet()
}

class TweetHeader: UICollectionReusableView {
    // 정의
    weak var delegate: TweetHeaderDelegate?
    
    private lazy var optionsButton: UIButton = {
        let button = UIButton(type: .system)
        button.tintColor = .lightGray
        button.setImage(UIImage(named: "down_arrow_24pt"), for: .normal)
        button.addTarget(self, action: #selector(showActionSheet), for: .touchUpInside)
        return button
    }()
    
    // Selector
    @objc func showActionSheet() {
        delegate?.showActinoSheet()
    }
}

  • TweetController(Contoller) 
class TweetController: UICollectionViewController {
	// 정의
    private let actionSheetLauncer: ActionSheetLauncher
}

// 헤더 구성 extension
extension TweetController {
    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerIdentifier, for: indexPath) as! TweetHeader
        header.tweet = tweet
        header.delegate = self
        return header
    }
}

// TweetHeaderDelegate extension
extension TweetController: TweetHeaderDelegate {
    func showActinoSheet() {
        actionSheetLauncher.show()
    }
}

 

정리 🗂

  • 실제 View의 이벤트를 구현해야 하는 파일에 Protocol을 만들어주고, 이벤트 함수 부분에 Protocol의 메서드를 넣어준다.
  • Controller에서는 해당 Protocol을 채택하여, extension에 어떤 응답을 할 것인지 구현하면 된다.

'Udemy.zip' 카테고리의 다른 글

[Swift]RxSwift 기초 문법  (0) 2022.04.13
[Swift] Firebase 기능  (0) 2022.03.25
[Swift]Table View 이슈  (0) 2022.03.05
[Swift]Model 동기화  (0) 2022.02.27