Search
Duplicate

앱의 화면이동 방법

생성일
2023/07/01 05:50
태그
Swift

앱의 화면이동 방법

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번째!