본문 바로가기

Swift

Navigation Controller - 자동 백버튼

왕초보의 Navigation Controller 이해하기


Navgation Bar를 놓고 거기에 자동으로 백버튼을 둘 수 있는 것 같은데 생각처럼 잘 작동하지 않는다.

쉽게 Navigation 기능을 쉽게 쓸 수 있을 것 같은데 뭔가 느낌은 오는데 구글링해도 스마트한 가르침을 찾기 어려웠다.

그러다가 역시 사놓고 안 보던 동영상 강의를 뒤져보니 괜찮은 방법이 나와서 그 방법을 기록해본다.


Main.Storyboard


우선 뷰의 구성은 아래와 같이 구성해보았다.

1. 기본 뷰를 선택한 상태에서 아래 그림처럼 메뉴에서 Navigation Controller를 선택한다.


2. 그리고 몇 개의 View Controller를 추가하고 각각의 뷰를 구분하기 위해 백그라운드 색상을 다르게 지정한다.


3. 위 그림에서는 이미 버튼과 뷰를 연결해 놓은 상태였는데, 각각의 뷰에 버튼을 넣고 나서 각 버튼을 아래 그림처럼 control + 드래그하여 다음 뷰에서 드랍하는 방식으로 연결을 한다. 영어로는 Show Segue라고 하는데 아직 segue의 개념을 잘 모르겠다. 뜻도 잘 모르겠고.. 그냥 대충 느낌만 올 뿐.. ㅎㅎ


4. 마지막까지 아래 그림처럼 버튼과 뷰 사이를 연결하여 버튼을 클릭하면 뷰를 호출할 수 있도록 한다.


5. 실행을 해 보면 아래 두 그림처럼 처음엔 레드 뷰가 등장하고 버튼을 클릭하면 그린 뷰가 보여지게 된다.

    여기서 위 네비게이션 뷰에 자동으로 Back 버튼이 나오게 된다. 버튼을 계속 눌러 다음 뷰로 넘어가도 이 Back 버튼은 계속 나오는 것을 볼 수 있다.

    이게 바로 내가 하고 싶었던 것이다.

6. 마지막 뷰에서 버튼을 누르면 처음의 레드 뷰로 오도록 하고 싶은데 그러려면 마지막 뷰에서 View Controller 클래스를 하나 만들고 살짝 코딩을 해야 한다. 그래서 YellowVC라는 클래스를 만들고 아래 그림처럼 Yellow View에 클래스를 등록해 주었다.


7. Yellow View 버튼에 Action을 부여하기 위해 아래 그림처럼 backToRed 메소드를 만든다.


결과는 대 성공!


다음 도전은 이 네비게이션 바의 오른편에 Bar 버튼을 삽입하여 Navigation 하는 것이다. 잠깐 시도해보았는데 두 번째 뷰부터 Bar Button이 들어가질 않는데 왜 그런지 모르겠다. ㅋ


아래 코드의 backToRed 메소드처럼 navigationController의 popTo...메소드를 이용하면 처음으로 돌아가거나 특정 뷰로 돌아가도록 지정할 수 있다.


YellowVC.swift



import UIKit

class YellowVC: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func backToRed(sender: AnyObject) {
        navigationController?.popToRootViewControllerAnimated(true)
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}