앱의 화면이동 방법
1.
코드로 화면 이동
2.
코드로 스토리보드 객체를 생성해서, 화면 이동
3.
스토리보드에서의 화면 이동(간접 세그웨이)
4.
스토리보드에서의 화면 이동(직접 세그웨이)
1. 코드로 화면 이동
ViewController
// 1) 코드로 화면 이동 (다음화면이 코드로 작성되어있을때만 가능한 방법)
@IBAction func codeNextButtonTapped(_ sender: UIButton) {
let firstVC = FirstViewController() // 메모리에 올려놓기!
firstVC.someString = "아기상어"
firstVC.modalPresentationStyle = .fullScreen
present(firstVC, animated: true, completion: nil) // 다음 화면으로 이동!
}
Swift
복사
FirstViewController
import UIKit
class FirstViewController: UIViewController {
let mainLabel = UILabel()
let backButton: UIButton = {
let button = UIButton(type: .custom)
button.setTitle("Back", for: .normal)
button.setTitleColor(.white, for: .normal)
button.backgroundColor = .blue
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
button.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return button
}()
var someString: String?
override func viewDidLoad() {
super.viewDidLoad()
setup()
configureUI()
}
func setup() {
mainLabel.text = someString
mainLabel.font = UIFont.systemFont(ofSize: 22)
view.addSubview(mainLabel) // 화면에 표시
view.addSubview(backButton)
view.backgroundColor = .gray
}
func configureUI() {
mainLabel.translatesAutoresizingMaskIntoConstraints = false // 오토레이아웃 세팅
mainLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true // 0 -> 가운데에 놔두겠다!(지워도 됨!)
mainLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
backButton.translatesAutoresizingMaskIntoConstraints = false
backButton.widthAnchor.constraint(equalToConstant: 70).isActive = true
backButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
backButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -40).isActive = true
backButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
}
@objc func backButtonTapped() {
// 다시 전화면으로!
dismiss(animated: true, completion: nil)
}
}
Swift
복사
2. 코드로 스토리보드 객체를 생성해서, 화면 이동
ViewController
// 2) 코드로 스토리보드 객체를 생성해서, 화면 이동
@IBAction func storyboardWithCodeButtonTapped(_ sender: UIButton) {
guard let secondVC = storyboard?.instantiateViewController(withIdentifier:
"secondVC") as? SecondViewController else { return } // 타입캐스팅
secondVC.modalPresentationStyle = .fullScreen
secondVC.someString = "아빠상어"
present(secondVC, animated: true, completion: nil)
}
Swift
복사
SecondViewController
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var mainLabel: UILabel!
var someString: String?
override func viewDidLoad() {
super.viewDidLoad()
mainLabel.text = someString
}
@IBAction func backButtonTapped(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
}
Swift
복사
3. 스토리보드에서의 화면 이동(간접 세그웨이)
Seque (세그웨이)
Segue (세그웨이)
•
화면이동을 담당하는 객체
segue.source
•
근원지 (출발하는 viewController)
segue.identifier
•
식별자 (세그웨이를 판별하기 위한 문자열)
segue.destination
•
종착지 (다음화면 viewController)
ViewController
// 3) 스토리보드에서의 화면 이동(간접 세그웨이)
@IBAction func storyboardWithSegueButtonTapped(_ sender: UIButton) {
// 세그웨이 활성화
performSegue(withIdentifier: "toThirdVC", sender: self)
}
// 세그웨이 방식의 데이터 전달 (prepare segue 메서드: 재정의)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toThirdVC" { // 먼저 identifier를 확인하고
let thirdVC = segue.destination as! ThirdViewController // 타입캐스팅해서 담아주기 -> thirdVC에 접근 가능
// 데이터 전달
thirdVC.someString = "엄마상어"
}
}
Swift
복사
ThirdViewController
import UIKit
class ThirdViewController: UIViewController {
@IBOutlet weak var mainLabel: UILabel!
var someString: String?
override func viewDidLoad() {
super.viewDidLoad()
mainLabel.text = someString
}
@IBAction func backButtonTapped(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
}
Swift
복사
4. 스토리보드에서의 화면 이동(직접 세그웨이)
•
직접적인 세그웨이를 만들었을 때만 shouldPerformSegue 가 실행된다. (버튼으로 직접적으로 연결 했을 때만)
ViewController
// 세그웨이 방식의 데이터 전달 (prepare segue 메서드: 재정의)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toThirdVC" { // 먼저 identifier를 확인하고
let thirdVC = segue.destination as! ThirdViewController // 타입캐스팅해서 담아주기 -> thirdVC에 접근 가능
// 데이터 전달
thirdVC.someString = "엄마상어"
}
if segue.identifier == "toFourthVC" { // 먼저 identifier를 확인하고
let fourthVC = segue.destination as! FourthViewController // 타입캐스팅해서 담아주기 -> fourthVC에 접근 가능
// 데이터 전달
fourthVC.someString = "뚜루루뚜뚜"
}
}
var num = 7
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if num < 5 {
return false
}
else {
return true
}
}
Swift
복사
FourthViewController
import UIKit
class FourthViewController: UIViewController {
@IBOutlet weak var mainLabel: UILabel!
var someString: String?
override func viewDidLoad() {
super.viewDidLoad()
mainLabel.text = someString
}
@IBAction func backButtonTapped(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
}
Swift
복사
가장 추천하는 방식은 → 2번째!