UIkit을 사용할 때 뷰 컨트롤러 간에 데이터를 전달하는 방법은 여러가지가 있다.
1. 세그 segue를 이용한 데이터 전달
스토리 보드를 사용하여 뷰 컨트롤러 간에 세그를 설정한 경우에 prepare(for: sender:) 메서드를 override 해서 데이터를 전달할 수 있다.
// 데이터를 보내는 쪽의 뷰 컨트롤러
class SendingViewController : UIViewController{
var dataToSend : String = "Hello, this is data"
override func prepare( for segue : UIStoryboardSegue, sender : Any? ){
if segue.identifier = "showSecondViewController"{
// 다른 뷰 컨트롤러로 데이터 전달
let destinationVC = segue.destination as! SecondViewController
destinationVC.receivedData = dataToSend
}
}
}
// 데이터를 받는 뷰 컨트롤러
class SecondViewController : UIViewController {
var receivedData : String?
override func viewDidLoad(){
super.viewDidLoad()
if let data = receivedData{
print(data)
}
}
}
2. 프로그램적으로 데이터를 전달
코드에서 직접 뷰 컨트롤러를 인스턴스화 한 후에 데이터를 전달하고
navigationController 또는 presend 메서드를 사용하여 뷰 컨트롤러를 이동시키는 방법입니다.
// 데이터를 보내는 쪽의 뷰 컨트롤러
class FirstViewController : UIViewController{
var dataToSend : String = "Hello, Second ViewController"
// btn press event
@IBAction func moveToSecondVC( _ sender : UIButton ){
let storyboard = UIStoryboard( name : "Main", bundle : nil )
if let secondVC = storyboard.instantiateViewController(withIdentifier : "SecondViewController") as? SecondViewController{
secondVC.receivedData = dataToSend
self.navigationContoller?.pushViewController(secondVC, animated : true)
}
}
}
// 데이터를 받는 쪽의 뷰 컨트롤러
class SecondViewController : UIViewController{
var receivedData : String?
override func viewDidLoad(){
super.viewDidLoad()
// 받은 receivedData를 사용하여 뷰 업데이트
if let data = receivedData{
print(data)
}
}
}
3. 델리게이트 패턴 ( 대리자 패턴 )을 사용한 데이터 전달
델리게이트 패턴은 데이터가 뷰 컨트롤러 반대방향 ( 다음의 뷰 컨트롤러에서 이전의 컨트롤러로 ) 전달될 때 유용하다.
델리게이트 패턴은 <두 객체 간의 약한 결합> 을 유지하면서도, 한 객체가 다른 객체의 특정행동을 실행할 수 있도록 한다.
// 두 번재 뷰 컨트롤러에서 정의된 델리게이트 프로토콜
protocol SecondViewControllerDelegate : AnyObject{
func didSendDataBack(data : String)
}
// 데이터를 보내는 뷰 컨트롤러
class SecondViewController : UIViewController{
weak var delegate : SecondViewControllerDelegate?
var dataToSendBack : String = "Data from SecondViewController"
// btn press event
@IBAction func sendDataBack( _ sender : UIButton ){
delegate?.didSendDataBack( data : dataToSendBack )
self.navigationController?.popViewController( animated : true )
}
}
// 첫번째 뷰 컨트롤러 ( 데이터를 받을 쪽 )
class FirstViewController : UIViewController, SecondViewControllerDelegate {
override func prepare( for segue : UIStoryboardSegue, sender : Any? ){
if segue.identifier == "showSecondViewController"{
let destinationVC = segua.destination as! SecondViewController
destinationVC.delegate = self
}
}
func didSendDataBack( data : String ) {
print(data)
}
}
'Ios > UI kit' 카테고리의 다른 글
약한 참조와 강한 참조 (1) | 2024.08.19 |
---|