segue? 세그? 세규?
사람마다 부르는건 다 다르지만
필자는 세그로 부르기로 했다.
segue 얘는 뷰컨트롤러 간에 데이터를
전달해주는 방법? 이라기 보다는
뷰 컨트롤러 간의 관계이고,
그 사이에서 데이터를 전달할 수 있는 방법이다.
대충 예를 들어보자면,

두개의 뷰 컨트롤러가 있다고 가정해본다면,
초록색 뷰 컨트롤러에서 입력을 하나 받는다고 치면
오른쪽 파란색 뷰 컨트롤러에서도 그 데이터가 필요한데
이 같은 데이터를 두번 만들 필요가 없는것.
쉽게 생각해서 전달해준다는
개념을 설명하는 것이다.
초록색 뷰 컨트롤러에 있는 데이터를
파란색 뷰 컨트롤러에 전달해준다.
라는 방법인것이다.
이를 어떻게 전달해주는가?
segue를 통하여 전달해주는 것이다.
새로운 단어가 등장할 것인데
identifier(아이덴티파이어), destination(데스티네이션)
이들은 만들면서 익혀보겠다.
세그가 정확히 뭐냐면 아래와 같다.

저렇게 연결된 것들을 세그라고 한다.
그러면 이것들을 사용할 때
어떻게 데이터를 전달 할 수 있는가?
각각의 뷰 컨트롤러가 있어야 한다.



이런식으로 파일을 만들어주는데

이파일을 만들고서 스토리보에서 연결해준다.


연결이 잘 되었는지 체크표시가 잘되었는지
더블체크 하는 습관도 들여보자.


두번째 뷰어도 컨트롤러 만들고 잘 연결해준다.
아.. 근데 생각해보니 이건 탭바네...

빠르게 다시 뷰를 만들고 오겠다.

대충 만들어서 5분도 안걸렸지만,
일단 이렇게 만들어줬고
오렌지 뷰어와 퍼플 뷰어에 똑같이 연결해줬다.
그리고 기억해야할게 있는데


여기 세그에는 현재 이름이 없는데
대충 아무거나 지어주고 나중에 사용하게
기억해두자.
필자는 위 세그 포함해서 goNext1, 2 로 지어줬다.
스토리보드로써는 직관적으로 보기엔 연결된건 보이지만,
이제 데이터전달은 코드로 작성해줘야한다.
데이터를 받아서 보여줘야 하니
레이블을 하나 추가해주고 두번째니까
두번째 뷰 컨트롤러에 인입 시켜야한다.

이렇게 되었다면
먼저 생각해볼건 입력을 받아서
특정한 버튼을 눌렀을 때
이름이 나오도록 하는것이다.
그러면 입력은 어디서 받아야 하는가?
입력은 버튼이 눌리기 전 화면에서 받을 예정이고
입력을 받고 버튼이 눌리면
데이터가 그대로 전달하게 할 예정이다.

입력 받을 수 있도록 텍스트 필드를
생성 및 첫번째 뷰 컨트롤러와 연결해주고,
저 입력 필드에 이제 아무 문구를 넣게되면
그 문구가 그대로 전달 받아서
다음 화면에 노출되게 해야하는 것이다.
설명은 되게 간단해 보이는데
그래서 어떻게 전달을 받는가?

이미 있는 걸로 알아서 함수를 찾아보았는데,
UIViewController 내부를 조금 살펴보니

이게 딱 보였다.
이게 뭐냐면
스토리보드 기반 화면 전환(Segue)시에
자주 사용하는 메서드인데, prepare 함수는
세그가 불리기 직전에 불리는 함수이다.
그러므로
이 함수를 재 정의를 해줘야 한다.


이렇게 틀을 넣어줬고
이제 정의를 해주자.

만약 세그의 아이덴티파이어가 "goNext 2"라면,
segue의 목적지 뷰컨트롤러를 FirstViewController 타입으로
!(느낌표)를 주어 강제로 캐스팅해서 가져오도록 정의해 준 것이다.
이미지에서는 g가 대문자여서 소문자로 수정했다.
근데 생각해보니 FirstViewController 타입으로
타입 캐스팅을 하면 안되고..
SecondViewController 타입으로 해줘야해서
바꿔줬다.

이렇게 해줬고
위에서 목적지가 SecondViewController 라고 정의 해줬으니
SecondViewController의 라벨의 텍스트가
입력 받은대로 전달하게끔 설정해줘야하니

이와 같이 정의해주었다.
이걸 풀어 설명해본다면
현재 화면에 있는 firstNameTextFild(텍스트 필드)에
사용자가 입력한 글자를,
다음 화면의 viewController 안에 있는 name이라는
UI 요소(UILabel 같은 것)의 text에 넘겨주는 코드가 되는것이다.
그러면 그냥 실행해서 확인해보면 오류가 뜬다.

이런오류는 자주 접할 수 있는 오류인데,

viewDidLoad 가 그려지기 전에 입력을 받았기 때문이다.
그러면 간단하다 viewDidLoad가 그려지고 나서
입력한것을 전달 받으면 된다.
음.. 우선은 받을 변수를 넣어주어야 하기 때문에
SecondViewController도 정의해주자.

위 이미지에서 UILabel에 느낌표(!)가 보일거다.
이미 없는것에 접근을 했고,
심지어는 쟤가 옵셔널을 암시적으로 까고 있기 때문에
터질 수 밖에 없는 상황이 된것이다.

그래서 이러한 장치(변수)가 필요한것이다.
받을 변수인 inputName을 문자열로 받을것이고,
name.text = inputName의 경우는
현재 위치가 override func viewDidLoad()
밑에 위치 시켰는데
override func viewDidLoad() 화면이
다 그려지고 나서 이름을 넣어야 하기 때문이다.
viewDidLoad()는 뷰가 메모리에 로드되고
UI 요소들이 초기화된 이후에 호출되는 메서드이기 때문에,
이 시점에서 UILabel에 값을 할당하는 것이 안전하기 때문이다.
라고 정리해볼 수 있겠다.
그리고
다시 FirstViewController로 돌아와서

이 내용을 바꿔줘야한다.

이렇게 바꿔줬다.
이걸 직역해보자면
세그가 로딩이 될때 가지고 있는 데이터
즉, 입력받는 데이터를 inputName에 넣어주는데
inputName은 SecondViewController에서 정의한대로
원래는 비어있는 상태인데 문자열로 입력 받을 거니까
뷰가 다 로딩이 되고 나면 inputName이
text에 들어가는 장치를 해두었기 때문에
이제는 잘 될텐데 firstNameTextFild.text! 여기부분에
느낌표를 마지막에 둔 이유는 문자열이
아닐 수 도 있기때문에 해준 것이다.

정상적으로 돌아가는것을 확인했다.
음.. UIKit은 뭐하나 쉬운게 없다는걸
다시금 깨닫게 된 시간이었다..
'IOS > Swift-TIL' 카테고리의 다른 글
| [Swift-TIL] HIG는 무엇이며 왜 읽어야 하는가? (6) | 2025.08.09 |
|---|---|
| [Swift-TIL] NavigationController가 있는 맛보기 앱 만들어보기 (3) | 2025.08.09 |
| [Swift-TIL] TabBarController 알아보기 (2) | 2025.08.06 |
| [Swift-TIL] 간단하게 NavigationController 알아보기 (3) | 2025.08.06 |
| [Swift-TIL] UItablaviewDelegate 살펴보기 (1) | 2025.07.26 |