ios
[ios - Swift] Delegate를 사용해서 뷰에 데이터 전송하기
POKY_0908
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 전 후 작성하더라도 사용 가능합니다.