iOS & Swift 공부 - Segue (세그)

김영채 (Kevin)·2021년 2월 6일
0

iOS & Swift

목록 보기
67/107

Segue 란?


  • 세그는 스토리보드에서 VC 사이의 화면전환을 위해 사용되는 객체다.

  • 별도의 코드 작성 없이 Storyboard 에서 세그를 연결하여 화면 전환 구현이 가능

    → 필요에 따라 UIViewController 의 performSegue(withIdentifier: sender: ) 메서드를 사용하여 세그 객체 실행 가능

주요 프로퍼티

  • var source: UIViewController : 세그에 전환을 요청하는 뷰 컨트롤러
  • var destination: UIViewController : 전환될 뷰 컨트롤러
  • var identifier: String? : 세그 객체의 식별자

주요 메서드

  • func perform() : 뷰 컨트롤러의 전환을 수행

세그 연결 방법

  • 키보드의 control 키를 누른 상태로 드래그하여 전환될 VC에 드롭하여 연결

  • Action Segue (종류) 중 Show 를 선택

prepare ( for segue: ,sender: ) 메서드


  • Segue 전환이 실행되기 전에 수행되는 메서드
  • Data Passing 용도로 많이 쓰임

// FirstViewController.swift

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    guard let nextVC: SecondViewController = segue.destination as? SecondViewController else {
        return
    }
        
    guard let cell: UITableViewCell = sender as? UITableViewCell else{
        return
     }
        
    nextVC.textToSet = cell.textLabel?.text
}

→ First VC 의 코드 중 prepare ( ) 메서드를 구현한 부분이다. 해당 메서드에서 우선 이동하고자 하는 VC의 인스턴스를 생성해야 한다 (nextVC).

→ 앱에서 Cell 을 누르면 두 번째 화면으로 전환할 수 있도록 Segue 를 정의한 상태이기 때문에 touch 한 Cell 이 유효한지도 확인이 꼭 필요하다.

→ 마지막으로 생성한 인스턴스의 프로퍼티 접근을 통해 Cell 의 textLabel.text 값을 보내준다.

참고:

  • Second View Controller 를 보면 textLabel 이라는 IBOutlet 이 있다. First VC 의 prepare( ) 함수에서 Second VC 의 인스턴스를 생성하고, 거기서 바로 .textLabel 에 접근하여 값을 설정할 수는 없는가?

    ex) nextVC.textLabel.text = cell.textLabel?.text

안 된다. nextVC 선언을 통해 SecondViewController 의 인스턴스가 생성은 됐지만, 아직 Second VC 내의 요소 (View, UILabel 등) 는 메모리에 올라간 상태가 아니다. 즉, Second VC 의 IBOutlet 인 textLabel 은 아직 생성되기 전이다. 그래서 First VC 에서 Second VC 의 IBOutlet 에 값을 직접절으로 할당하는 것이 불가능하다.

profile
맛있는 iOS 프로그래밍

0개의 댓글