티스토리 뷰

view에서 다른 view로 전환하면서 데이터를 전달할 때 prepare을 사용하는데

prepare을 알아보겠습니다.

 

일단 스토리보드는 다음과 같이 만들어 놓았습니다.

 

 

performSegue(withIdentifier:sender:)

func performSegue(withIdentifier identifier: String, 
           sender: Any?)

segue를 실행할 때 사용합니다.

저는 버튼을 누를 때 segue를 실행하겠습니다.

    @IBAction func toNavi(_ sender: Any) {
        performSegue(withIdentifier: "navi", sender: nil)
    }
    
    @IBAction func toBasic(_ sender: Any) {
        performSegue(withIdentifier: "normal", sender: nil)
    }
    

 

prepare(for:sender:)

func prepare(for segue: UIStoryboardSegue, 
      sender: Any?)

segue가 실행되기 전에 준비할 내용은 이 메서드에 작성합니다.

message = "Success"를 전달하겠습니다.

class ViewController: UIViewController {
    
    let message = "Success"
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func toNavi(_ sender: Any) {
        performSegue(withIdentifier: "navi", sender: nil)
    }
    
    @IBAction func toBasic(_ sender: Any) {
        performSegue(withIdentifier: "normal", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "navi" {
            if let vc = segue.destination as? NaviViewController {
                vc.message = message
            }
        } else if segue.identifier == "normal" {
            if let vc = segue.destination as? NormalViewController {
                vc.message = message
            }
        }
    }
    
}

받는 쪽

class NaviViewController: UIViewController {

    var message = "nil"
    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = message
    }
}
class NormalViewController: UIViewController {

    var message = "nil"
    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = message
    }

}

결과

NavigationController에 imbed한 view는 performSegue는 되는데 prepare이 되지 않습니다.

 

NaviViewController 배경색은 노란색이죠.

앞에서 설정한 segue는 첫번째 ViewController에서 NavigationController로 가게되어있습니다.

그래서 prepare을 조금 수정해줘야합니다.

 

아래와 같이 수정해주세요.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "navi" {
            if let target = segue.destination as? UINavigationController, let vc = target.topViewController as? NaviViewController {
                vc.message = message
            }
        } else if segue.identifier == "normal" {
            if let vc = segue.destination as? NormalViewController {
                vc.message = message
            }
        }
    }

이제 message가 제대로 나옵니다!!

댓글
공지사항