본문 바로가기

개발 코딩 정보 공유/애플 iOS 스위프트 Xcode

IOS Segue와 ViewController를 사용한 화면 전환

 

 

 

 

 

 

 

 

 

 

안녕하세요.

김과자 입니다.

오늘은 IOS 개발중 조금은 난해한 화면 컨트롤 부분입니다.

우리가 만들게 될 어떠한 앱이든 간에  화면이동은 무조건 들어가게 되겠지요?

안타깝게도...? IOS에서 화면 이동을 구현하는 방법은 굉장히 많습니다.

하나씩 살펴보겠습니다.

살펴볼 화면 이동 방법들 입니다. 굉장히 많죠. 하루에 다 작성할순 없습니다. (시간이...)

하나씩 시리즈로 올려보겠습니다.

 

1. segue를 통한 화면이동

 

화질무엇???

 

우선 버튼을 하나 생성합니다. 그리고storyboard 상에 ViewController를 생성하겠습니다.

UseSegueViewController 라고 클래스도 만들어 주겠습니다.

 

당연히 커스텀 클래스로 연결해주시구요.

다음은 쉽습니다.

버튼에 대고 오른쪽 버튼을 누른채 해당 SegueViewController 화면으로 드래그 합니다.

 

그럼 이와같이 action segue 를 선택하라고 합니다.

고르세요^^

 

저는 Present Modally 로 띄우겠습니다.

UseSegueViewController의 소스는 이렇습니다.

class UseSegueViewController: UIViewController {
    var delegate: UIViewController?
    var sendData: Int = 0
    
    override func viewWillAppear(_ animated: Bool) {
        print("========\(sendData)========")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        if let _ = delegate{
            (delegate as! ViewController).onReceiveMsg(msg: "받아라~")
        }
    }
}

delegate나 sendData는 이후에 데이터 전달을 위해 작성하였습니다. 일단 무시 하시고~

아래에서 설명드리겠습니다.

 

자 그럼 띄워보겠습니다. 

 

네 잘 뜨고 있네요. 어려운게 전혀 없죠?

이렇게 끝내긴 심심하니, 데이터 전달을 해보겠습니다.

데이터의 전달 방식은 delegate 패턴을 이용하겠습니다. delegate패턴은 프로그래밍기법의 고전중 고전인데요.

현대의 코딩에서도 보이지 않게 아주 많은곳에서 쓰고 있습니다.

우리말로 번역해보자면 위임자. 정도로 볼수 있겠네요.

안드로이드에서는 listener 정도가 비슷하게 쓰인다고 볼수 있습니다.

 

//세그로 데이터전달가능
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print(segue.identifier!)
        switch segue.identifier! {
        case "segueId":
            let secondViewController = segue.destination as! UseSegueViewController
            secondViewController.sendData = 111
            secondViewController.delegate = self
        default:
            break
        }
    }

 

해당 코드는 ViewController에서 override 하여 작성합니다. 여기서 segueId?? 가 뭐지 하실텐데요.

바로 storyboard 에서 연결한 segue의 id 입니다.

 

 

이렇게 segue를 선택하시면

 

 

 

 

segue의 id를 지정할수 있습니다.

다시 돌아와서... 소스를 보면 해당 파라메터로 들어온 segue의 destination 즉 도착화면을 UseSegueViewController 로 캐스팅 한후

sendData 와 delegate를 지정하는것을 볼수 있습니다.

case "segueId":
    let secondViewController = segue.destination as! UseSegueViewController
    secondViewController.sendData = 111
    secondViewController.delegate = self

그리고 나서 UseSegueViewController에서 데이터를 활용하고, 마지막에 delegate로 값을 전달해 보겠습니다.

즉 양방향 통신! 이죠.

override func viewWillDisappear(_ animated: Bool) {
        if let _ = delegate{
            (delegate as! ViewController).onReceiveMsg(msg: "받아라~")
        }
    }

 

당연히 ViewController에는 아래와 같이 함수가 만들어져 있어야 겠죠?

//데이터받기
    func onReceiveMsg(msg:String?){
        
        if let _ = msg {
            print("========\(msg)==========")
        }
        
    }

이게 전부 입니다. (사실은 delegate를 위해 프로토콜을 만들고 그에 맞게 데이터를 전달하는게 좋습니다만... 간단한 예제를 위해...)

 


2. segue를 이용한 다른방법

 

조금 나아졌나???

segue를 이용한 다른 화면 이동 방법 입니다.

모든것이 동일하고 최종 호출 방법만 다릅니다.

1번에서는 마우스 그래그를 통해 ViewController와 UseSegueViewController를 segue로 연결해주었죠?

하지만 이번 방법은 드래그로 연결 하지 않습니다. 소스상에서 호출하도록 만들어 보겠습니다.

 

 

 

세그의사용2 버튼에 onUseSegue 라는 함수를 연결해주겠습니다.

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

 

그럼 이런식으로 잡히겠죠? 그리고 나서 내부 소스를 보시면 self.performSegue를 통해 "segueId" 화면을 호출 하게 됩니다.

그럼 데이터 전달은 어떻게 할까요? 동일합니다.

1번에서 설명한 prepare 와, delegate 패턴을 통해 작성 하면됩니다.


정리글

 

 

이렇게 오늘 segue를 사용한 화면 이동에대해 간단하게 알아보았습니다.

세부 내용은 문서를 참고 하세요~! (떠넘기기...)

 


참고

https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html