Things take time

[SWIFT] 뷰 전환하기 및 데이터 전달 본문

iOS (기능)

[SWIFT] 뷰 전환하기 및 데이터 전달

겸손할 겸 2017. 8. 11. 10:58

[뷰 전환]


안드로이드의 경우, 인텐트를 통한 것으로 해당 뷰와 데이터 전달까지 간편하게 할 수 있지만, 스위프트에서는 여러 개의 방법이 존재한다.

대표적으로는


1. 네비게이션 컨트롤러를 이용한 방법 : 스토리보드상에서 관련 뷰 들을 네비게이션 컨트롤러의 아래에 두고 스택처럼 쌓여 들어가는 구조이다.

2. 세그웨이를 통한 방법

3. 스토리보드 내에 해당 VC(View Controller)의 identifier를 이용한 방법


으로 구분할 수 있다.


일단 네비게이션 컨트롤러는 내가 잘 사용하지 않아서.. 스택구조처럼 NavigationController.pushView, popView로 전환했다가 이전 뷰로 돌아갔다가를 수행한다.

검색 검색



세그웨이를 통한 방법은 스토리보드상에서 시작 VC에서 대상 VC까지를 우클릭 드래그(혹은 Ctrl + 왼클릭 드래그)로 연결하여 (Show로 하던, 다른 방식으로 하던) 이동할 수 있도록 세그를 연결하고, 해당 세그의 ID를 부여하여 performSegue를 통해 이동하는 방법이다.



위 캡쳐처럼, 파란색 짤린 VC에서 오른쪽 VC로 이동하도록하고 attribute 탭에서 id를 부여한다. 그리고 코드 상 이동은

 self.performSegue(withIdentifier: "mapSegue1", sender: nil)

이처럼 이동하게 하면 된다. 그리고 세그웨이를 통한 이동에는 prepare라는 함수가 있는데, 이 함수에서는 해당 세그웨이가 해당 VC로 전환되기 직전에 호출된다. 그럼 이 함수에서 사용할 기능은? => 데이터 전달(변수 세팅)이라 할 수 있다.

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print(segue.identifier!)
        
        switch segue.identifier! {
        case "mapSegue1":
            let mapViewController = segue.destination as! MapViewController
            mapViewController.delegate = self
        default:
            break
        }
    }

이렇게 seuge의 destination은 UIViewController로 리턴되므로, 이를 커스텀 VC파일로 형변환하고, 딜리게이트 연결을 하거나.. 변수가 필요하다면 mapViewController.변수 = 값으로 세팅하면 되는 것이다.



그리고 마지막의 스토리보드내에서 VC id를 이용한 동적변환 방법이 있다. 세그웨이를 이용한 방법에서는 id를 해당 세그웨이에 부여하여 스토리보드까지 연결해야되는 번거로움이 있는 것은 사실이다. 하지만 그만큼 개발자가 봤을때 구조를 이해하기 편한 장점은 분명하다. 사용은 개발자의 몫


어쨌든, 여기서는 세그웨이나 기타 연결은 필요없고 스토리보드에서 해당 VC자체에 id만 부여하면 된다.




해당 뷰 컨트롤러의 Storyboard ID를 세팅하고 코드상에서는

        let storyBoard = self.storyboard!
        let mapViewController = storyBoard.instantiateViewController(withIdentifier: "mapView") as! MapViewController
        mapViewController.delegate = self
        present(mapViewController, animated: true, completion: nil)

이렇게만 써주면, 세그웨이에서 했던 performSegue 및 prepare함수 두 개의 구문이 하나의 구문에서 사용가능해진다. 선택은 자유!