Navigation Controller
앱에서는 화면 이동이 매우 많습니다.
tab bar와는 다르게 화면 간 연관성이 많고 데이터를 주고받아야 할 경우도 있습니다.
Navigation Controller를 이용하면 화면간의 데이터를 주고받을 수 있습니다.
Navigation Controller 추가하기
메뉴에서 [Editor > Embed in > Navigation Controller]를 선택하면 Navigation Controller가 추가됩니다.
화면 이동 추가하기
스토리보드에서 button을 우클릭 드래그해서 다른 뷰 컨트롤러에 놓아 show segue를 추가합니다.
뷰 전환 시 데이터 전달하기(뷰를 push할 때)
데이터를 전달하고자하는 view에는 받는 변수를 생성합니다.
class EditViewController: UIViewController {
var textWayValue: String = ""
override func viewDidLoad() {
super.viewDidLoad()
lblWay.text = textWayValue
}
}
segue를 이용하여 화면을 전환하기 위해 prepare 함수를 이용합니다.
segue시, view의 변수에 값을 할당하여 데이터를 전달합니다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let editViewController = segue.destination as! EditViewController
if segue.identifier == "editButton" {
editViewController.textWayValue = "segue : use button"
} else if segue.identifier == "editBarButton" {
editViewController.textWayValue = "segue : use Bar button"
}
editViewController.textMessage = txMessage.text!
editViewController.delegate = self
}
이동된 뷰에서 호출한 뷰로 돌아가기
Navigation stack에 쌓인 뷰를 pop 시킵니다.
navigationController?.popViewController(animated: true)
뷰 전환 시 데이터 전달하기(뷰를 pop 할 때)
Protocol로 EditDelegate를 데이터를 보내는 뷰 파일에서 정의합니다.
해당 프로토콜로 delegate 변수를 생성합니다.
import UIKit
protocol EditDelegate {
func didMessageEditDone(_ controller: EditViewController, message: String)
}
class EditViewController: UIViewController {
var delegate: EditDelegate?
@IBOutlet var txMessage: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
txMessage.text = textMessage
}
@IBAction func btnDone(_ sender: UIButton) {
if delegate != nil {
delegate?.didMessageEditDone(self, message: txMessage.text!)
}
navigationController?.popViewController(animated: true)
}
}
데이터를 받는 뷰(ViewController)에서는
segue 호출 시, delegate를 self로 지정합니다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
...
editViewController.delegate = self
}
그리고 EditDelegate를 상속받아서, 프로토콜의 함수를 구현합니다.
그럼 함수의 변수(message)로 데이터를 전달받아서 사용할 수 있습니다.
class ViewController: UIViewController, EditDelegate {
@IBOutlet var txMessage: UITextField!
func didMessageEditDone(_ controller: EditViewController, message: String) {
txMessage.text = message
}
}
Reference
Do it! 스위프트로 아이폰 앱 만들기: 입문(개정판 5판)
https://developer.apple.com/design/human-interface-guidelines/ios/bars/navigation-bars/
https://developer.apple.com/documentation/uikit/uinavigationcontroller
'iOS > 스위프트로 아이폰 앱 만들기' 카테고리의 다른 글
[13장] Audio (0) | 2021.10.17 |
---|---|
[12장] Table View (0) | 2021.10.17 |
[10장] Tab bar (0) | 2021.10.17 |
[9장] Page control (0) | 2021.10.16 |
[8장] Map View (0) | 2021.10.11 |