[iOS] Xcode - Segue

Oxong·2022년 2월 15일
0

iOS 개발 관련 모음

목록 보기
2/8

공부한 것을 정리하는 용도의 글이므로 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시에 프로퍼티에 접근해 넘겨주는 방식

  1. destination에 빈 문자열로 된 text 가변 프로퍼티를 하나 선언한다.
    var text : String = ""

  2. 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 ?? "" 
    }
}
  1. 2에서 전달한 데이터를 destination의 라벨에 띄워주고 싶다면 viewDidLoad()에서 아래와 같이 지정해주면 된다.
override func viewDidLoad(){
	super.viewDidLoad()
    textLabel.text = text
}


◼️ 간접 전달 방식 (비동기 방식)


🔹 UserDefaults 사용

UserDefaluts도 plist 처럼 Key-Value 형태로 값을 저장/쓰기가 가능한 클래스.
기기에 .plist 형태로 저장이 된다.

기기에 저장되어 있는 파일이기 때문에, 앱을 종료하더라도 데이터가 보존된다.

간단한 사용자정보 (자동로그인 여부, 체크 여부등)을 저장하는데는 적합하다.

---------> 안드로이드의 SharedPref 같은 느낌인듯?



🔹 Appdelegate 사용

AppDelegate는

  1. 앱의 scene을 환경설정하고,

  2. 앱의 가장 중요한 데이터 구조를 초기화하는 역할을 수행한다.

하지만 AppDelegate에 데이터를 저장해놓고, 앱이 종료되면 전부 초기화 된다.

---------> 앱이 종료되어도 데이터를 남기고 싶다면 CoreData / UserDefaults를 활용해야 한다.










Reference


[Swift] 데이터 전달
iOS) Segue
[iOS Swift] 화면 이동 - segue

0개의 댓글