[iOS] Segue 화면전환, 데이터전달 방법

Segue


간단한 앱을 만들다가 탭을 하면 다른화면으로 전환하는 기능을 구현하고 싶어서 찾아보니 Segue라는걸 사용한다고 나와있다. 스토리보드로 구현하는 방법을 알아보자.

프로퍼티

  • var source: UIViewController 화면 전환 요청하는 뷰 컨트롤러
  • var destination: UIViewController 화면 전환 대상 뷰 컨트롤러
  • var identifier: String? Segue 객체 식별자

    메서드

  • func perform() Segue 화면 전환 실행
  • func func prepare(for segue: UIStoryboardSegue, sender: Any?) Segue 객체와 destination 뷰 컨트롤러가 생성 된 후, 화면 전환 전 실행되는 메서드로 데이터 전달 코드를 여기에 구현한다



*** Button01에서 컨트롤키 누르고 클릭 후 오른쪽 뷰에서 클릭을 떼면 사진처럼 나오는데, Action Segue에 Show를 눌러서 버튼과 destination(오른쪽 뷰)를 연결한다. 이 방법은 Segue를 가장 쉽게 실행 하는 방법이다.


이것처럼 버튼과 직접 연결하는 방법도 있지만, 소스와 destination을 연결하는 방법도 있다.

왼쪽위의 파란색 배경의 아이콘을 위에서 했던 방법과 똑같이 연결해준다. 이건 버튼이 아닌 뷰컨트롤러랑 연결하는 것이다.
여기서 끝이 아니라 Segue의 Identifier 값을 문자열로 지정하고 Button02를 IBAction으로 버튼이 클릭 될 때 Segue를 실행하는 코드를 적어야 한다.

  @IBAction func button02(_ sender: Any) {
        performSegue(withIdentifier: "viewcontroller", sender: self)
    }

첫번째 파라미터는 연결하고자 하는 Segue의 Identifier 값을 똑같이 입력해준다. 두번째 파라미터 sender는 Segue를 실행시킨 트리거를 전달하는데 Segue를 제어할때 주로 사용한다. ***

이번에는 데이터 전달하는 방법을 알아보자 목표는 Segue의 Identifier값을 전환된 뷰에 텍스트로 나타내는 것이다. Button01의 연결된 Segue Identifier 값을 button01이라하고 코드를 작성해보면

source view
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? DetailViewController {
            vc.fromSourceViewText = segue.identifier
        }
    }

segue 속성들은 업캐스팅 되어 리턴이 되기때문에 타입캐스팅을 사용해서 접근해야 한다.

destination view
    @IBOutlet weak var detailViewText: UILabel!
    var fromSourceViewText: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        detailViewText.text = fromSourceViewText
    }


결과 화면

Tags: ,

Categories:

Updated: