공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊
by. Oxong
하나의 View에서 다른 View로 전환하는 방법들이 있다.
그 중에서 Segue도 꽤나 간단하게 전환(연결)해주는 기능이다.
그런데 Segue를 연결하면 아래와 같은 창이 뜨면서 Action Seque를 선택해야 한다.
해당 Action에는 어떤 차이가 존재하는 걸까?
일반적으로 가장 많이 사용하는 segue이다.
목적지 뷰 컨트롤러를 내비게이션 스택에 쌓인다.
Navigation Controller가 설정되어 있다면 목적지 뷰 컨트롤러에는 뒤로가기 버튼이 생성된다.
Navigation Controller가 없을 때는 Present Modally가 적용된다.
모달로 적용될 경우, 이동된 화면에서 원래의 화면으로 돌아올 수 없다.
split View 구조에서 주로 사용된다. (ex. 메모장 앱의 목록 -> 메모를 클릭했을 때 보이는 전체 화면)
split view controller는 자식 뷰 컨트롤러를 새로운 컨텐츠로 replace하고, 그 외의 view controller에서는 Present Modally(모달)로 보여준다.
view controller를 화면 하단에서 상단으로 끌어올리며 모달로 화면을 보여준다.
원래 화면은 모달 화면 뒤에 존재하는 상태.
아이폰에서는 Present Modailly와 동일.
개발자가 지정한 행동을 하는 segue이다.
그냥 화면에서 화면으로 이어주는 것은 segue가 아니더라도 다양한 방법이 존재한다.
segue를 사용하는 가장 큰 이유는 segue를 활용하여 데이터를 교환할 수 있다는 것에 있다.
전달하는 방식을 말하기 전에, segue 관련 메소드를 먼저 알아보자.
세그웨이의 진행여부를 결정한다.
내부에서 특정 상태일 때 세그웨이를 진행하지 않으면 이 부분에서 상태에 따른 반환을 할 수 있다.
override func shouldPerformSegue(withIdentifier identifier: String,
sender: Any?) -> Bool
세그웨이가 발생하기 직전에 수행된다. (실행 직전 준비)
sender는 Segue를 발생시킨 trigger오브젝트이다.
한 뷰 컨트롤러에서 다른 뷰컨트롤러의 세그웨이는 여러 개가 존재 할 수 있다.
그에 해당하는 trigger에 따른 분기가 가능하다.
segue.identifier 프로퍼티를 이용해서 segue 종류에 따른 분기가 가능하다.
segue.destination / segue.source 프로퍼티를 이용해서 destination에 해당하는 뷰 컨트롤러에 데이터를 전달할 수 있다.
override func prepare(for segue:segue, sender: Any?)
세그웨이를 실행한다.
원하는 순간에 prepare(for:segue)를 통해 segue를 실행시킨다.
→ segue의 시점을 통제(제어)할 수 있다.
주로 화면이 테이블 뷰/ 컬렉션 뷰 일때 사용한다.
특정 cell 또는 특정 item을 클릭했을 때, 관련 데이터를 연결하기 위해 사용하는 것이다.
테이블 뷰의 경우 ) didSelectRowAtIndexPath
컬렉션 뷰의 경우 ) didSelectItemAtIndexPath 메서드를 사용하여 구현한다.
먼저 이동 전 화면을 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 ?? ""
}
}
override func viewDidLoad(){
super.viewDidLoad()
textLabel.text = text
}
UserDefaluts도 plist 처럼 Key-Value 형태로 값을 저장/쓰기가 가능한 클래스.
기기에 .plist 형태로 저장이 된다.
기기에 저장되어 있는 파일이기 때문에, 앱을 종료하더라도 데이터가 보존된다.
간단한 사용자정보 (자동로그인 여부, 체크 여부등)을 저장하는데는 적합하다.
---------> 안드로이드의 SharedPref 같은 느낌인듯?
AppDelegate는
앱의 scene을 환경설정하고,
앱의 가장 중요한 데이터 구조를 초기화하는 역할을 수행한다.
하지만 AppDelegate에 데이터를 저장해놓고, 앱이 종료되면 전부 초기화 된다.
---------> 앱이 종료되어도 데이터를 남기고 싶다면 CoreData / UserDefaults를 활용해야 한다.