본문 바로가기
🍎 iOS/UI

[iOS] 네비게이션 컨트롤러가 연결된 뷰컨트롤러에 세그값 넘기기(UINavigationController Segue and UIRootViewController)

by Fomagran 💻 2020. 1. 12.
728x90
반응형

세그를 이용해 데이터를 넘기려다가 네비게이션컨트롤러가 연결된 뷰컨트롤러에 바로 넘기니깐 네비게이션 바가 생략되면서 화면이 전환되었다.  아래처럼

해결방법은 네비게이션컨트롤러에 세그를 걸어준 뒤 네비게이션 컨트롤러와 연결된 뷰컨트롤러에 데이터를 전달하는 방법이었다.

아래처럼 세그를 네비게이션 컨트롤러에 연결해주고 identifier를 정해준다.

그리고 값을 보낼 컨트롤러에서 override func prepare를 통해 현재 뷰컨트롤러의 텍스트필드 값을 네비게이션의 text 변수에 보내주고 버튼을 눌렀을 때 performSegue가 되게 한다. withIdentifier엔 아까 정해놓은 것을 넣어주면 된다.

 

 

import UIKit

class GoViewController: UIViewController {

    @IBOutlet weak var tf: UITextField!
    @IBOutlet weak var gobtn: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()

      
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
             let nav = segue.destination as! Navigation
                nav.text = self.tf.text ?? ""
       }
    

    @IBAction func gobtn(_ sender: Any) {
        
        self.performSegue(withIdentifier: "show", sender: nil)
    }
    

}

이렇게 되면 var text엔 전 GoViewController에서 보낸 텍스트필드 값이 들어있다. 이걸 현재 네비게이션에 연결된 뷰컨트롤러의 receive라는 변수에 보내준다.

import UIKit

class Navigation: UINavigationController {
    
    var text = String()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let rootViewController = viewControllers.first as? RootViewController {
                   rootViewController.receive = self.text
               }

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

이렇게 receive에 값을 받고 현재 label값을 receive로 설정해주면 된다!

import UIKit

class RootViewController: UIViewController {
    
    var receive = String()
    @IBOutlet weak var lbl: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.lbl.text = receive
        
    }
   

   
}

이렇게하면 네비게이션의 타이틀이나 아이템들을 모두 가진 채 화면을 띄울 수 있다!!

728x90
반응형

댓글