본문 바로가기

iOS/스위프트로 아이폰 앱 만들기

[11장] Navigation

728x90

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