ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ios - Swift] Delegate를 사용해서 뷰에 데이터 전송하기
    ios 2020. 11. 30. 18:00

     

     

     

    이번 글에서는 델리게이트를 사용해서 뷰에 데이터를 전송하는 것을 목표로 코드를 작성했습니다.

     

    A, B 컨트롤러를 구현 후 A 컨트롤러에서는 데이터 전송, B 컨트롤러에서는 데이터를 수신을 할 수 있도록 하겠습니다.

     

     

     

    이미지와 같이 A, B 두 가지의 UIViewController와 클래스를 구현합니다.

     

    뷰 구현이 끝났다면. Swift 파일을 생성 후 사용할 델리게이트 코드를 작성해 주도록 합니다.

     

    import Foundation
    
    protocol MessageDelegate : class {
        func SendMessage(pMessage: String?)
    }

    프로토콜이 무엇인지는 검색하면 자세히 나오니 궁금하신 분은 따로 찾아보면 됩니다.

     

     

    먼저 데이터를 전송받을 B 컨트롤러를 구현하도록 할 텐데 작성한 MessageDelegate를 선언하면 아래와 같은 문구가 나오는 것을 확인할 수 있습니다. 

     

    이는 프로토콜 내 함수가  해당 뷰 컨트롤러 내 구현되지 않아 나오는 것으로 Fix를 눌러서 구현하면 됩니다.

     

     

     

     

    import UIKit
    
    class BController: UIViewController, MessageDelegate {
    
        var ReciveText: String?
        @IBOutlet weak var mMainLabel: UILabel!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            if ReciveText != nil {
                mMainLabel.text = ReciveText
            }
        }
    
        func SendMessage(pMessage: String?) {
            ReciveText = pMessage
        }
    }

    B 컨트롤러를 코드를 보면 MessageDelegate.swift 에서 작성한 SendMessage를 이용해 라벨 텍스트를 수정하도록 구현하였습니다.

     

     

    A 뷰 컨트롤러에 버튼을 추가 후 코드를 작성해 보도록 하겠습니다.

     

    import UIKit
    
    class AController: UIViewController {
    
        weak var myDelegate: MessageDelegate?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
        @IBAction func viewMove(_ sender: Any) {
            let controller = self.storyboard?.instantiateViewController(identifier: "BController") as! BController
            
            self.myDelegate = controller
            
            self.navigationController?.pushViewController(controller, animated: true)
            myDelegate?.SendMessage(pMessage: "메시지를 전송합니다.")
        }
    }
    

     

    self.myDelegate = controller

    myDelegate의 대리자를 B컨트롤러로 설정하는 것이라고 생각하면 될 것 같습니다.

     

    SendMessage는 Push 전 후 작성하더라도 사용 가능합니다.

     

    댓글

Designed by Tistory.