IOS Segue

IOS Segue

2018, Oct 02    

* Segue

  • Segue란?

: 사전적 의미로는 ‘다른 것으로 부드럽게 넘어가는 것’을 의미한다. IOS에선 화면전환을 의미한다.
  • Segue의 종류

    - 주의 : Segue를 할 때는 늘 새로운 인스턴스 객체가 생성

    - Show : Show는 Navigation Controller에서 push/pop의 push를 의미한다. Navigation Controller의 스택 상에 Destination ViewController를 삽입하여 쌓게 된다. ‘UINavigationControllerDelegate’를 사용하면 다양한 전환 효과를 구현할 수 있다.
    - Show Detail(iPad만 해당) : UISplitViewController를 사용할 때, 사용하는 Segue. 아이패드에서 화면을 가로로 눕히면 등장하는 Detail View상에 ViewController를 밀어 넣게 된다. Navigation Controller의 스택에슨 전혀 영향을 주지 않는다.
    - Present Modally : presentViewController 메소드와 동일한 동작을 하게 된다. 옵션에 따라 viewController를 띄우는 애니메이션에 변화를 줄 수 있다. Navigation Controller의 스택에는 전혀 영향을 주지 않는다. 단, ‘Modally’라는 단어에서 알 수 있듯이 이미 Presentation을 한 ViewController에서 다른 ViewController를 presentation 할 수 없다. Show와 같이 ‘UINavigationControllerDelegate’를 사용하면 다양한 전환 효과를 구현할 수 있다.
    - Popover Presentation(iPad만 해당) : Show Detail과 같이 iPad에서만 볼 수 있는 View Transition이다. 작은 팝업 뷰 혹은 context menu 형식으로 ViewController를 띄우는 방법이다. 아이폰에서도 사용은 가능핮디만 단순한 Modal View처럼 표시된다.
  • Segue 화면 전환 방법

1. ViewController(테이블뷰의 셀이 Static일 때 유용) : 스토리보드의 ViewController 아이콘을 화면전환할 ViewController에 Control 드래그 –> 옵션 선택
2. Button : 스토리보드에 Button을 하나 만들고 Segue할 ViewController에 Control 드래그 –> 옵션 선택. Button을 코드로 끌어와 @IBAction으로 만들어줄 필요 없다.
* Button의 문제점 : 두번째 화면에서 다시 첫번째로 돌아올 방법이 없다는 것. Navigation Controller를 달아주고 Segue를 Present Modally가 아닌 Show로 하면 뒤로가기 버튼이 달리기는 하지만 그 외에는 방법이 없다. 이럴 땐 ‘Exit’가 필요 !
* Exit 만들기 (Unwind Segue) : 두번째 화면 –> 첫번째 화면, 첫번째 화면 위에 두번째 화면이 쌓여 있는데 두번째 화면이 없어지면서 다시 첫번째 화면이 나타난다. 만약 1 –> 2 –> 3 순으로 Segue를 하고 3에서 다시 1로 돌아가는 Unwind Segue를 만들면 3, 2 ViewController가 다 사라지고 1만 나타나게 된다.
** <주의사항> 보통 button이 있는 ViewController에 Button 코드를 넣지만 Unwind Segue는 돌아갈 ViewController에 코드를 넣어야 한다. Button과 코드를 다 작성하고 Button을 Button이 있는 viewController의 Exit 아이콘에 Control 드래그 해서 연결하면 된다. **

#####

  • source : Segue시 시작점에 해당하는 ViewController 가리킨다
  • destination : 전환하고자 하는 도착점에 해당하는 ViewController 가리킨다
  • Segue 데이터 교환

- 화면을 전환하면서 두 화면 간에 데이터 교환, 갱신하고 무엇인가 보여줘야 더 큰 의미가 있다. Segue의 데이터 교환과 관련해서 UIViewController에서 2가지 메서드 제공.
  • prepareForSegue : 세그웨이 실행 전 준비
  • performSegueWithIdentifier : 세그웨이 실행
  • Segue Identifier

- 세그웨이 데이터 교환을 더 알아보기 전에, 각 Segue를 구별할 수 있다록 식별자를 지정해 주는 작업이 우선되어야 한다. 데이터를 교환하는 메서드를 수행할 때, 메서드가 어떤 Segue에 대해 일을 처리해야하는지 알아야 한다. 각 Segue 별로 이름을 지정. Segue를 선택한 다음, 우측 상단의 Attributes Inspector 안의 Identifier에 이름 입력.
  • PrepareForSegue

- Segue 실행 준비하는 메서드, 이동전 화면(A)에서 작성.
  • 어떤 Segue가 실행될 때인가?
  • 해당 Segue가 실행되면 이동할 화면(B)은 무엇인가?
  • 이동된 화면(B)의 어느 데이터를 어떻게 변경할 것인가?
- performSegueWithIdentifier 필요 없이 prepareForSegue만으로도 해당 Segue가 실행되면 즉시 데이터 교환이 실행됨.
** <주의사항> 이동된 화면(B)의 IBOutlet(ex Label) 데이터를 바로 바꿔줄 순 없다. 화면(B)의 Label의 텍스트 값을 화면(A)에서 가져온 텍스트 값으로 변경하고 싶을 때, 바로 변경이 불가능. 화면(B)에 property를 만들어 Segue가 property 값을 변경하게 만들고, 화면(B)의 코드에서 Label의 데이터를 변경하도록 코드를 작성해야 한다.
  • performSegueWithIdentifier

- performSegueWithIdentifier는 ‘‘원하는 순간’‘에 prepareForSegue를 통해 Segue를 실행시키는 코드.
- Segue의 시점을 통제할 수 있게 된다.
- 주로 화면(A)가 테이블뷰나 컬렌션뷰일 때 사용.
- 화면(A)의 특정 셀이나 아이템을 누르면 화면(B)로 Segue하여 관련 데이터를 보여줄 때
- 테이블 뷰 : didSelectRowAthIndexPath 메서드
- 컬렉션뷰 : didSelectitemAtIndexPath 메서드
메서드들 안에서 performSegueWithIdentifier 사용. 셀이나 아이템을 누르면 화면이 이동
- didSelectRowAtIndexPath와 같은 메서드들은 사용자가 선택한 IndexPath를 인자값으로 가지고 오기 때문에 그대로 IndexPath를 활용할 수 있는 장점이 있다. 사용자가 셀이나 아이템을 클릭하는 순간 바로 prepareForSegue에서 준비된 코드들이 실행되도록 하는 것이 didSelectRowAtIndexPath 내의 performSegueWithIdentifier이다.