2022. 11. 20. 12:52ㆍiOS
셀에서의 버튼 액션을 사용할 수 없기 때문에 이 부분을 컨트롤러에 전해줘야 합니다.
이 부분을 실행하는 데에 있어 다른 방법도 있겠지만 델리게이트 패턴을 사용하기에 델리게이트 패턴에 대해 알아보도록 하겠습니다.
@IBOutlet weak var addButton: UIButton!
addButton.addTarget(self, action: #selector(add), for: .touchUpInside)
@objc func add(sender: UIButton) {
}
우선은 버튼을 생성한 상태에서 연결을 진행한 후에
addtarget을 진행하여 액션을 실행할 함수를 만들어 줬습니다.
이 부분이 실행되는 부분은 컨트롤러가 아닌 셀에서 진행되고 있음을 설명드립니다.!
그렇기에 add 함수에 액션 명령을 하달하더라도 이 부분이 컨트롤러로 전달되어지지 않기 때문에 버튼 액션을 실행이 되지 않습니다.!
그래서 이 부분을 실행하기 위해서 델리게이트 패턴을 사용했습니다.!
protocol AddButtonDelegate: AnyObject {
func addTaget()
}
먼저 델리게이트 패턴을 사용할 수 있게 프로토콜을 채용합니다.! ( 셀에서 생성을 진행했습니다.!)
이후 weak var delegate: AddButtonDelegate? 델리게이트를 채용합니다. weak를 사용한 이유는 충돌을 방지하기 위해서입니다.!
테이블 뷰 셀
protocol AddButtonDelegate: AnyObject {
func addTaget()
}
class TableViewCell: UITableViewCell {
weak var delegate: AddButtonDelegate?
@objc func add(sender: UIButton) {
delegate?.addTaget()
} 액션 함수에 델리게이트를 사용할 수 있게 넣어줍니다.
뷰 컨트롤러
extension ViewController: AddButtonDelegate {
func addTaget() {
let storyboacrd = UIStoryboard.init(name: "PopUpView", bundle: nil)
let popUpVC = storyboacrd.instantiateViewController(withIdentifier: "PopUpView") as! PopUpView
popUpVC.modalPresentationStyle = .overCurrentContext
popUpVC.modalTransitionStyle = .crossDissolve
self.present(popUpVC, animated: true)
}
}
컨트롤러로 돌아와서 추가적으로 델리게이트를 채용하고 버튼 입력 시 사용할 액션을 작성합니다.
뷰 컨트롤러
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as? TableViewCell else { fatalError() }
cell.delegate = self // 셀프로 알린다.
return cell
이후 델리게이트 패턴을 구현했다는 것을 셀프로 알리면 셀에서의 버튼 액션이 컨트롤러로 전달되어 액션 함수가 실행이 됩니다.
'iOS' 카테고리의 다른 글
didSelectRowAt 메소드 사용시 주의사항 (delegate) (0) | 2023.01.03 |
---|---|
UIRefreshControl에 대해 알아보기(로딩 인디케이터) (0) | 2023.01.02 |
IntrinsicContentSize 에 대해서 알아보기 (2) | 2022.11.20 |
기본적인 Userdefaults 사용 하기. (0) | 2022.11.08 |
하나의 TableView에서 다중 Cell 작업하기 (0) | 2022.10.30 |