[iOS] Xcode - Segue
공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊
by. Oxong
하나의 View에서 다른 View로 전환하는 방법들이 있다.
그 중에서 Segue도 꽤나 간단하게 전환(연결)해주는 기능이다.
그런데 Segue를 연결하면 아래와 같은 창이 뜨면서 Action Seque를 선택해야 한다.
해당 Action에는 어떤 차이가 존재하는 걸까?
Segue 종류
◼️ Show (push)
일반적으로 가장 많이 사용하는 segue이다.
목적지 뷰 컨트롤러를 내비게이션 스택에 쌓인다.
Navigation Controller가 설정되어 있다면 목적지 뷰 컨트롤러에는 뒤로가기 버튼이 생성된다.
Navigation Controller가 없을 때는 Present Modally가 적용된다.
모달로 적용될 경우, 이동된 화면에서 원래의 화면으로 돌아올 수 없다.
◼️ Show Detail (replace)
split View 구조에서 주로 사용된다. (ex. 메모장 앱의 목록 -> 메모를 클릭했을 때 보이는 전체 화면)
split view controller는 자식 뷰 컨트롤러를 새로운 컨텐츠로 replace하고, 그 외의 view controller에서는 Present Modally(모달)로 보여준다.
◼️ Present Modailly
view controller를 화면 하단에서 상단으로 끌어올리며 모달로 화면을 보여준다.
원래 화면은 모달 화면 뒤에 존재하는 상태.
◼️ Present As Popover
아이폰에서는 Present Modailly와 동일.
◼️ Custom
개발자가 지정한 행동을 하는 segue이다.
그냥 화면에서 화면으로 이어주는 것은 segue가 아니더라도 다양한 방법이 존재한다.
segue를 사용하는 가장 큰 이유는 segue를 활용하여 데이터를 교환할 수 있다는 것에 있다.
전달하는 방식을 말하기 전에, segue 관련 메소드를 먼저 알아보자.
Segue 관련 함수
◼️ shouldPerformSegue(withIdentifier: :)
세그웨이의 진행여부를 결정한다.
내부에서 특정 상태일 때 세그웨이를 진행하지 않으면 이 부분에서 상태에 따른 반환을 할 수 있다.
override func shouldPerformSegue(withIdentifier identifier: String,
sender: Any?) -> Bool
◼️ prepare(for:sender :)
세그웨이가 발생하기 직전에 수행된다. (실행 직전 준비)
sender는 Segue를 발생시킨 trigger오브젝트이다.
한 뷰 컨트롤러에서 다른 뷰컨트롤러의 세그웨이는 여러 개가 존재 할 수 있다.
그에 해당하는 trigger에 따른 분기가 가능하다.
segue.identifier 프로퍼티를 이용해서 segue 종류에 따른 분기가 가능하다.
segue.destination / segue.source 프로퍼티를 이용해서 destination에 해당하는 뷰 컨트롤러에 데이터를 전달할 수 있다.
- 어느 segue가 실행될 때인가?
- 해당 segue가 실행되면 이동할 화면은 어디인가?
- 이동된 화면의 데이터는 어떻게 변경할 것인가?
override func prepare(for segue:segue, sender: Any?)
◼️ performSegue(withIdentifier:, :)
세그웨이를 실행한다.
원하는 순간에 prepare(for:segue)를 통해 segue를 실행시킨다.
→ segue의 시점을 통제(제어)할 수 있다.
주로 화면이 테이블 뷰/ 컬렉션 뷰 일때 사용한다.
특정 cell 또는 특정 item을 클릭했을 때, 관련 데이터를 연결하기 위해 사용하는 것이다.
테이블 뷰의 경우 ) didSelectRowAtIndexPath
컬렉션 뷰의 경우 ) didSelectItemAtIndexPath 메서드를 사용하여 구현한다.
Segue의 데이터 교환
먼저 이동 전 화면을 source(출발점), 이동 후 화면은 destination(목적지, 도착점)이라고 한다.
◼️ 직접 전달 방식 (동기 방식)
present / push시에 프로퍼티에 접근해 넘겨주는 방식
-
destination에 빈 문자열로 된 text 가변 프로퍼티를 하나 선언한다.
var text : String = ""
-
source에서 prepare(for: sender)메소드 안에 전달할 데이터를 작성해준다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// segue의 목적지가 secondViewController라면
if segue.destination is SecondViewController {
// as? 뒤의 화면(secondViewController)으로 이동 시킬거야.
let vc = segue.destination as? SecondViewController
// 프로퍼티 값 대입
vc?.text = self.segueTextField.text ?? ""
}
}
- 2에서 전달한 데이터를 destination의 라벨에 띄워주고 싶다면 viewDidLoad()에서 아래와 같이 지정해주면 된다.
override func viewDidLoad(){
super.viewDidLoad()
textLabel.text = text
}
◼️ 간접 전달 방식 (비동기 방식)
🔹 UserDefaults 사용
UserDefaluts도 plist 처럼 Key-Value 형태로 값을 저장/쓰기가 가능한 클래스.
기기에 .plist 형태로 저장이 된다.
기기에 저장되어 있는 파일이기 때문에, 앱을 종료하더라도 데이터가 보존된다.
간단한 사용자정보 (자동로그인 여부, 체크 여부등)을 저장하는데는 적합하다.
---------> 안드로이드의 SharedPref 같은 느낌인듯?
🔹 Appdelegate 사용
AppDelegate는
-
앱의 scene을 환경설정하고,
-
앱의 가장 중요한 데이터 구조를 초기화하는 역할을 수행한다.
하지만 AppDelegate에 데이터를 저장해놓고, 앱이 종료되면 전부 초기화 된다.
---------> 앱이 종료되어도 데이터를 남기고 싶다면 CoreData / UserDefaults를 활용해야 한다.
Reference
[Swift] 데이터 전달
iOS) Segue
[iOS Swift] 화면 이동 - segue
Author And Source
이 문제에 관하여([iOS] Xcode - Segue), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ryalya/iOS-Xcode-기본-segue-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)