세그는 스토리보드에서 VC 사이의 화면전환을 위해 사용되는 객체다.
별도의 코드 작성 없이 Storyboard 에서 세그를 연결하여 화면 전환 구현이 가능
→ 필요에 따라 UIViewController 의 performSegue(withIdentifier: sender: ) 메서드를 사용하여 세그 객체 실행 가능
주요 프로퍼티
var source: UIViewController
: 세그에 전환을 요청하는 뷰 컨트롤러var destination: UIViewController
: 전환될 뷰 컨트롤러var identifier: String?
: 세그 객체의 식별자주요 메서드
func perform()
: 뷰 컨트롤러의 전환을 수행세그 연결 방법
// 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 에 값을 직접절으로 할당하는 것이 불가능하다.