View
[iOS 앱개발 - Swift] 세그 : Segue
세그는 Segueway를 줄여서 칭하는 것이라 블로그 포스팅 앞쪽에서 한번 언급했었던 것 같네요. 제가 주로 세그를 사용헸던건 스토리보드 상에서 화면전환을 연결할 때 가장 쉬웠던 방식이라서 이걸 썼었는데, 이제야 세그에 대해 제대로 공부하게 되었네요. ㅋㅋㅋㅋ
이 글은 edwith의 부스트코스 iOS 프로그래밍 강의를 들으며 공부한 내용을 정리한 포스팅입니다!
세그란 무엇일까?
세그는 스토리보드에서 뷰 컨트롤러에서 다른 뷰 컨트롤러로 화면전환을 할 때 코드로 구현할 필요 없이 연결을 통해 화면 전환을 구현하는 도구입니다. 물론 코드를 이용해 이 세그를 사용할 수도 있습니다. UIStoryboardSegue
클래스에는 기본 스타일의 화면전환을 위한 프로퍼티와 메서드를 가지고 있고, 이 클래스를 가져와 서브클래스를 만들어 커스텀스타일의 화면 전환을 사용할 수도 있습니다.
주요 프로퍼티
var source: UIViewController
- 세그에 전환을 요청하는 뷰 컨트롤러var destination: UIViewController
- 전환될 목적지 뷰 컨트롤러var identifier: String?
- 세그 객체의 식별자
주요 메서드
func prepare(for: sender: )
- 다른 뷰 컨트롤러로 화면을 전환할 때 미리 데이터를 전달하기 위한 메서드func perform( )
- 화면 전환을 수행하는 메서드
세그 사용하는 방법
이 화면전환 방법이 저는 제일 쉬운 방법이라고 생각해요. Xcode로 iOS 빌드를 할 때 가장 처음 써봤던 기능이기도 하고, 엄청 쉽게 구현이 가능하니깐요. ㅋㅋㅋ 그래도 내용이 나왔으니 다시 한번 정리해보도록 합시당!
뷰 컨트롤러 2개와 Segue 액션을 실행해줄 버튼을 하나 만들어줍니다.
원하는 버튼을 누르고, 그 위에서 Control 키를 누른채로 목표 뷰 컨트롤러로 드래그앤 드랍을 한 다음에
원하는 세그 스타일을 골라주면
이렇게 세그웨이가 손쉽게 연결이 됩니다. :-)
매일 포스팅을 이렇게 쉽게 작성했으면 좋겠네요 ㅋㅋㅋㅋㅋㅋㅋ
세그로 뷰에 데이터 전달하기
이전 포스팅에서 쭉 사용해오던 테이블 뷰 예제를 가져와서 좀 더 변형을 시켜볼게요. 테이블뷰의 해당 셀을 누르면 네비게이션 컨트롤러 안에서 세그웨이로 뷰가 이동하고, 그 뷰에 놓여있는 레이블에 눌렀던 셀의 타이틀이 적혀있게 만들어봅시다.
우선, 앞에서 사용하던 테이블 뷰를 가져온 다음, 네비게이션 컨트롤러에 Embed In 해주고, 새로운 뷰 컨트롤러에 레이블을 하나 추가한 다음 셀에서 컨트롤+클릭으로 끌고와 세그를 연결해줍시다.
새로 만들어준 뷰 컨트롤러를 관리할 새로운 뷰 컨트롤러 파일을 하나 만들어주고 (이름은 SecondViewController로 짓겠습니당)
새로 만들어준 뷰컨트롤러에 아래의 프로퍼티를 추가해 title을 받아와 label에 적어줄 수 있도록 합니다.
뷰컨트롤러를 만들면 아래의 코드가 주석처리 되어있는데, 세그로 데이터를 전달하기 위해 그 코드를 이용해줄거예요. 설명으로 적혀있듯이, 스토리보드로 어플리케이션을 만든 경우, 네비게이션을 위해 미리 약간의 준비를 하고자 할 때 이 메서드를 이용해주면 된다고 적혀있네요! segue.destination을 이용해 목적지 뷰 컨트롤러에 접근할 수 있고, 여기에 접근해 원하는 데이터를 전달해주면 됩니다. 간단하네요!! 참고로, 이건 출발지 뷰 컨트롤러에 들어가는 코드입니다.
이 메서드를 가지고 기능을 작성해볼텐데, segue.destination은 목적지 View Controller를 이야기하고 sender는 이 메서드가 발생하게 한 객체 (여기서는 TableViewCell이 sender가 되겠네요) 를 이야기합니다. 둘을 상수로 선언을 해주고 ( guard를 통해 안전하게 값을 형변환해옵니다. 만약에 형변환에 실패하면 else 구문으로 넘어가서 return 으로 메서드를 종료합니다. ) 아까 선언해둔 textToShow 프로퍼티에 TableViewCell의 textLabel에 있는 text를 가져와 넣어줍니다.
그런데 textToShow는 @IBOutlet으로 Label과 연결된 값이 아니니까, 값을 넣어주는 작업이 필요합니다. 이를 위해 이전에 공부해뒀던 메서드를 사용합시다. 공부한 포스팅은 요기! ViewWillAppear(animated:) 를 이용하여 뷰가 화면 위에 올라올 때 레이블에 해당 텍스트를 넣어주도록 합니다.
굳이 뷰의 textLabel에 직접 넣어주지 않고 textToShow라는 String 타입의 변수를 거치는 이유는 다음과 같아요.
지금 위 메서드는 prepare, 즉 준비를 하는 단계이기 때문에 메모리에 뷰 컨트롤러가 로드되어있는 상태라도, 뷰의 컨텐츠들은 아직 로드가 덜 된 상태예요. 따라서, textLabel (UILabel) 에 직접 넣어주려 하면 아직 로드되지 않아 찾아 못하기 때문에 Exception이 발생할 수 있어요. 이런 위험요소를 제거하기 위해 따로 두고 뷰 컨텐츠가 모두 로드된 뒤에 값을 넣어주는 것이랍니다!
세그가 여러개 라면?
만약에 연결해야할 세그가 여러개라면? 하나뿐인 prepare 메서드를 어떻게 처리해줘야 할까요?
첫번째로, 각각의 세그도 식별자 (Identifier) 를 가질 수 있습니다. 스토리보드에서 세그를 선택한 뒤 Inspector 창에서 작성해줄 수 있습니다.
이 식별자를 구분할 때 사용해서 다음과 같이 나누어줄 수도 있습니다.
두번째로는 목적지 뷰의 타입이 어떤지에 따라 나눌 수 있습니다.
타입캐스팅을 시도했을 때 guard를 이용해서 가능하면 코드를 실행하고, 불가능하면 다른 타입으로 캐스팅을 시도하면서 맞는 타입을 찾아 그에 맞는 코드를 실행해주면 되겠죠?
이렇게 작성한 뒤에 프로젝트를 빌드해주면 아래와 같은 결과를 얻을 수 있습니다.
이번 글에서는 가장 처음, 그리고 가장 익숙하게 사용했던 화면 전환 방법에 대해 좀 더 공부를 해봤습니다. 확실히 스토리보드를 이용하니 코드를 통해 구현하는 것보다는 편하긴 편한 것 같네요 ㅋㅋㅋㅋㅋ.
이 글은 edwith 의 부스트코스 iOS 프로그래밍 강의를 들으며 공부한 내용을 정리한 포스팅입니다. 기존에 프로그래밍에 대한 어느정도의 기본기가 있는 분이 iOS 프로그래밍, 아이폰 앱개발을 공부하려 시작하기에 굉장히 괜찮은 강의라고 생각해요. 모든 강의와 강의자료가 무료로 제공되고, 네이버 아이디로도 강의를 들을 수 있기 때문에 부담없이 한 번 들어볼만한 강의라고 생각합니다! 각 챕터마다 프로젝트로 간단한 앱을 만드는 것을 목표로 하여 강의를 듣고, 혼자서 앱을 만드는 연습을 할 수 있게 강좌가 구성되어 있어서, 기본기부터 Xcode 개발환경을 익히고 앱을 만드는 과정을 배우기에 적합한 강의라는 느낌을 받고 있어요.
이 강좌에 관심이 있으신 분은 아래 링크에서 한번 확인해보세요!
https://www.edwith.org/boostcourse-ios
'Develop > iOS 개발' 카테고리의 다른 글
[iOS 앱 개발 - Swift] Swift 에서 JSON 다루기 (0) | 2019.08.22 |
---|---|
[iOS 앱 개발 - Swift] Codable과 CodingKey, JsonEncoder와 JsonDecoder (0) | 2019.08.21 |
[iOS 앱개발 - Swift] 뷰 / 셀의 재사용 (0) | 2019.08.18 |
[iOS 앱개발 - Swift] 테이블뷰에 커스텀셀 추가 (1) | 2019.08.17 |
[iOS 앱개발 - Swift] 테이블뷰에 동적으로 셀 추가하기 (0) | 2019.08.17 |