지난 포스팅에서는 뷰 이동 시 데이터 전달에 있어서, 직접 스토리보드의 뷰 id로 접근하여 값을 넘기는 방법에 대해 알아보았는데요. 이번에는 프로토콜과 delegate를 이용하는 방법에 대해 알아보겠습니다.
상황은 이렇습니다. 첫번째 뷰에서 버튼 클릭 시 두번째 뷰로 넘어가고, 두번째 뷰의 레이블에 첫번째 버튼 텍스트가 입혀집니다.
두번째 뷰의 버튼을 클릭 시, 두번째 뷰는 dismiss
되고, 첫번째 뷰로 두번째 뷰 버튼의 텍스트를 입힙니다.
즉, 주요는 두 뷰 간 이동 시 데이터를 전달한다는 점입니다. 지난 포스팅에서 전자에 대한 부분을 설명했기 때문에, 이번에는 dismiss
시 이동 방법에 대해 알아보겠습니다.
먼저 스토리보드와, 2개의 뷰에 대한 스위프트 파일을 아래와 같이 셋팅합니다.
FirstViewController
class FirstViewController: UIViewController, MyProtocol {
@IBOutlet var btnFirst: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnFirstClicked(_ sender: UIButton) {
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyBoard.instantiateViewController(withIdentifier: "secondVC") as! SecondViewController
vc.dataReceived = btnFirst.currentTitle
vc.delegate = self
self.present(vc, animated: true, completion: nil)
}
func protocolData(dataSent: String) {
btnSecond.setTitle(dataSent, for: .normal)
}
}
SecondViewController.swift
protocol ProtocolData {
func protocolData(dataSent: String)
}
class FirstViewController: UIViewController, MyProtocol {
@IBOutlet var btnSecond: UIButton!
@IBOutlet var lblSecond: UILabel!
var dataReceived: String = ""
var delegate: ProtocolData?
override func viewDidLoad() {
super.viewDidLoad()
lblSecond.text = dataReceived
}
@IBAction func btnSecondClicked(_ sender: UIButton) {
self.delegate?.protocolData(dataSent: btnSecond.currentTitle)
self.dismiss(animated: true, completion: nil)
}
}
- 데이터를 보낼 쪽에서 프로토콜을 선언하고, delegate를 선언합니다.
- 받는 쪽에서 해당 프로토콜을 상속하면, 프로토콜 메소드를 필수로 갖게 되어있습니다. 해당 메소드를 통해 두번째 뷰로부터 데이터를 받을 수 있습니다.
'Developer > iOS, Swift' 카테고리의 다른 글
[Swift] 일반 View, ImageView, Label 액션 이벤트 생성하기 (2) | 2019.11.20 |
---|---|
[Swift] 네이버 장소검색(search Place) API 사용하기 (2) | 2019.11.17 |
[Swift] ViewController 간 화면 전환 및 데이터 주고받기 (Programmatically) (291) | 2019.11.10 |
[iOS] 탭바 컨트롤러의 이미지 사이즈/색상은? (253) | 2019.08.25 |
[iOS] 탭바 Tab Bar Controller 사용하기 (feat. 안드로이드 Bottom Navigation View) (285) | 2019.08.25 |
댓글