밤에 쓴 코드

iOS) Segue 본문

iOS

iOS) Segue

붱이🦉 2019. 7. 23. 22:42

Segue

하나의 Scene 으로부터 다른 Scene으로의 전환을 보여주는 연결입니다.

  • Segue Type
     
Symbol Type Description
img Show
(Push)
이 segue는 target view controllershowViewController:sender: 가 실행된다.
일반적으로는 source View Controller위에 새로운 컨텐트가 모달로 보여진다.
몇몇 뷰컨트롤러들은 해당 메소드가 재정의 되어있어서 다른동작을 한다.
UIKit은 targetViewControllerForAction:sender:메소드로 source View Controller 를 찾는다.

예) NavigationViewController 는 새로운 뷰컨트롤러를 네비게이션 스택에 push 한다.
img Show Detail
(Replace)
이 segue는 target view controllershowDetailViewController:sender:메소드가 실행된다.
이 segue는 UISplitViewController 객체 내에 내장된 view controller에 대해서만 관련된 segue이다.
split view controller는 자식 뷰컨트롤러를 새로운 컨텐츠로 replace합니다.
나머지 대부분의 view controller에서는 모달로 보여줍니다.
img Present Modally 이 segue는 view controller를 모달로 보여준다.
img Present as Popover 기존 view 에 앵커를 둔 컨텐츠를 보여줍니다.
img Custom 개발자가 지정한 행동을 하는 segue입니다.
  • UIModalTransitionStyle(animation - 전환 효과 )

  • enum UIModalTransitionStyle: Int {
          case coverVertical 
      // viewcontroller가 전환될 때 view가 미끄러지듯이 올라오고, dissmiss시 내려가는 기본 transtion스타일
            case flipHorizontal
      // 오른쪽에서 왼쪽으로 수평회전을 한다. 🔄 새로 떠오르는 뷰가 이전 뷰의 뒷면에 있던 것처럼 보인다. 뒤집히는 모양의 transition
            case crossDissolve
      // 이전 뷰가 흐릿해지고 전환될 뷰가 뚜렷해지는 효과가 동시에 일어난다.
            case partialCurl
      // 한 쪽 코너에서 전환될 뷰가 말아 올라오는 형태로 드러난다. UIModalPresentationStyle.fullScreen 에서만 지원되고 , 다른 형태에서 사용시 exception이 발생한다
    }
  • UIModalPresentStyle

  • enum UIModalPresentStyle: Int {
        case automatic
      // 시스템이 보여주는 방식을 정한다.
        case fullScreen
      // 스크린을 덮는 보여주는 방식
        case pageSheet
      // 기본 뷰를 일부분을 덮는 보여주는 방식
        case formSheet
      // 스크린의 중앙에 컨텐츠를 보여주는 방식
        case currentContext
      // 다른 뷰컨트롤러를 통해 내용을 보여주는 방식
        case custom
      // 사용자 정의 animator 객체로 부터 관리되는 보여주는 방식
        case overFullScreen
      // 스크린을 덮는 뷰를 보여주는 방식
        case overCurrentContext
      // 다른 뷰 컨트롤러의 컨텐츠를 통해 보여주는 방식
        case blurOverFullScreen
      // 새로 표현하는 뷰를 보여주기 전에 기존의 뷰를 흐릿하게 하며 보여주는 방식
        case popover
      // popover뷰로 보여주는 방식
        case none
    
    }
  • Show (Push)

    showPush
    • UINavigationViewController의 경우 Navigation Stack에 viewcontroller가 push된다.

    • 위의 NavigationBarItem을 보면 < Back 을 누르면 현재 viewcontroller가 pop된다.

  • Present Modally

    presentModally
    • viewcontroller를 modal로 보여주는 방식이다,
    • 이전 view를 가리는 새로운 view가 보여지는 방식이다.
  • CustomSegue

    customSegue2
    • 사용자 정의 segue 이다.
    • 개발자가 정의한 대로 동작하고 UIStoryboardSegue를 상속하며 , perform()을 재정의하여 동작하게 할 수 있다.
  • Prepare

    Prepare
    • Segue 가 발생하여 다른 viewcontroller로 전환되기 직전에 발생하는 prepare()가 호출된다.
    • source viewcontroller에서 destination viewcontroller 로 _data_를 넘기기위해 사용할 수 있다.
  • Unwind


  • 액션메소드 정의하기

// destination 이 될 viewcontroller 파일 내에 선언

@IBAction func myUnwind(_ segue: UIStoryBoardSegue) {
}

unwind()destination이 될 viewcontroller를 정한다.

    • 그 곳에unwindSegue를 받을 수 있는@IBAction메소드를 정의해둔다.
  • Exit 연결하기

    • segue의 트리거를 드래그해서exit에 놓는다.

    • IBAction으로 정의된 메소드 목록이 노출되고 거기에 연결된다.

스크린샷 2019-07-23 오후 11 25 36

스토리 보드의 흐름도

  • shouldPerformSegue() : 세그웨이 진행여부 판단

  • optional func shouldPerformSegue(withIdentifier identifier: NSStoryboardSegue.Identifier, 
                              sender: Any?) -> Bool
    • 세그웨이의 진행여부를 결정한다.
    • 내부에서 특정상태 일 때 세그웨이를 진행하지 않는 다면 이 부분에서 상태에 따른 반환을 하면된다.
  • prepareForSegue() : 세그웨이 직전 제어

  • // swift에서의 prepareForSegue
    func prepare(for segue: UIStoryboardSegue, 
          sender: Any?)
    • 세그웨이가 발생하기 직전에 수행된다.
    • senderSegue를 발생시킨 trigger오브젝트이다.
      • 한 뷰 컨트롤러에서 다른 뷰컨트롤러의 세그웨이는 여러 개가 존재 할 수 있다
      • 그에 해당하는 trigger 에 따른 분기가 가능하다.
    • 이 메소드내에서 새로 보여질 뷰컨트롤러의 데이터를 제어할 수있다.
    • segue.identifier 프로퍼티를 이용해서 segue 종류에 따른 분기가 가능하다.
      • 한 뷰 컨트롤러가 전환 될 뷰 컨트롤러가 다양하여 Segue가 여러개 존재 할 수 있다.
    • segue.destination / segue.source 프로퍼티를 이용해서 destination 에 해당하는 뷰 컨트롤러에 데이터를 전달할 수 있다.

'iOS' 카테고리의 다른 글

URLSession Tutorial: Getting Started 번역본  (1) 2019.10.20
iOS) IBOutlet / IBAction  (0) 2019.07.23
iOS) ViewController의 특징과 생명주기  (0) 2019.07.23
iOS) UITabBarController, UITabBar  (0) 2019.07.13
Comments