코드 진행을 위한 디테일한 구현이 아닌 흐름을 기록했습니다. 😀
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 |