본문 바로가기
Ios/UI kit

뷰 컨트롤러 간에 데이터를 전달하는 방법

by 잘먹는 개발자 에단 2024. 8. 19.

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