Swift 화면간 데이터 전달
Swift에서 화면 전환간 데이터 전달하는 방법
1. ViewController를 찾아 직접 전달 (A->B로 전달)
ViewController가 가진 변수에 직접 data를 전달
@IBAction func tapCodePresentButton(_ sender: Any) {
guard let viewController = self.storyboard?.instantiateViewController(identifier: "CodePresentViewController") as? CodePresentViewController else { return}
viewController.name = "Honggggggg"
viewController.modalPresentationStyle = .fullScreen
viewController.delegate = self
self.present(viewController, animated: true, completion: nil)
}
2. prepare, performSegue로 전달하는 방법
prepare는 ViewController로 넘어가기 전에 호출되는 녀석임
따라서 segue의 destination을 옮겨갈 ViewController로 Down-Casting해주고 변수를 사용하면 된다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? SeguePushViewController {
viewController.name = "Yeol"
}
}
또한 특정 버튼이 눌렸을 때 특정 값을 전달하는것도 perfomrSegue를 통하면 가능하다.
performSegue -> prepare로 전달되고, 이때 sender에 값을 넣어주면 된다.
performSegue(withIdentifier: "SeguePushViewController", sender: "asdsad")
2. B -> A로 역으로 전달하는 방법
역으로 전달하는 방법은 ViewController가 닫히기 전에 delegate를 사용하여 전달하면 된다.
protocol을 사용하여 delegate를 선언하는데, AnyObject를 상속 받도록 한다.
이유는 class안에서 delegate를 써야하는데, weak 를 걸어줘야기때문이다.
weak는 메모리 누수때문이 사용하고, 이번 강의 듣기 전까지 나는 사용하지 않았었다.
하지만 프로젝트가 커질수록 꼭 써야할것 같다.
protocol SendDataDelegate:AnyObject {
func sendData(name:String)
}
class CodePresentViewController: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
var name:String?
weak var delegate:SendDataDelegate?
override func viewDidLoad() {
super.viewDidLoad()
if let name = name {
self.nameLabel.text = name
self.nameLabel.sizeToFit()
}
}
@IBAction func tapBackButton(_ sender: Any) {
self.delegate?.sendData(name: "CHoi")
self.dismiss(animated: true, completion: nil)
}
}
그리고 main에서 이 delegate를 처리하면 된다.
@IBAction func tapCodePresentButton(_ sender: Any) {
guard let viewController = self.storyboard?.instantiateViewController(identifier: "CodePresentViewController") as? CodePresentViewController else { return}
viewController.name = "Honggggggg"
viewController.modalPresentationStyle = .fullScreen
viewController.delegate = self
self.present(viewController, animated: true, completion: nil)
}
extension ViewController:SendDataDelegate {
func sendData(name: String) {
self.dataLabel.text = name
self.dataLabel.sizeToFit()
}
}
이번에 이걸 공부하면서 느낀점은
1. Storyboard상에서 마우스 드래그로 바로 segue를 할 경우에는 데이터 전달이 어렵다고 생각했는데, prepare함수로 써주면 될것 같다.
2. delegate를 사용하여 데이터를 뒤로 전달할 경우에는 코드상 구현이 편할것 같다. 코드로 구현할 경우에는 viewcontroller를 이미 가지고 있지만, storyboard에서 바로 구현하면 viewcontroller가 없기때문에 전달하기 난감하다.
-> 2번에 대한 방법은 구글링을 통해 좀 더 찾아봐야겠다.