관리 메뉴

java,javascript,android,php,sql,공부용,메모용

화면간 데이터전달 다시 정리하기.. / segue 화면전환 delegate 데이터전달 본문

모바일/SwiftUI ios 공부

화면간 데이터전달 다시 정리하기.. / segue 화면전환 delegate 데이터전달

yy_dd2 2021. 12. 5. 18:12
반응형

화면간 데이터 전달은 중요한거 같아서 다시 정리했다.

 

MainStoryboard

여기서 첫번쨰 화면 -> 두번째화면으로 이동하는 버튼 우클릭 연결해서

Action segue 부분은 show

두번째화면은 당연히 새파일 SendDataViewController 만들고나서 class 연결

 


첫번째 화면-> 두번째 화면 (>> 다음 화면으로 데이터 전달하기)

 

두번째화면에서 SendDataViewController

import UIKit

class SendDataViewController: UIViewController {

    @IBOutlet weak var dataLabel: UILabel!
    var data : String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let data = data {
            self.dataLabel.text = data
            self.dataLabel.sizeToFit()
        }
    }
    
}

 

첫번째 화면에서 ViewController

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var dataLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func tapNextButton(_ sender: UIButton) {
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? SendDataViewController {
            vc.data = "1->2 보내는 데이터"
        }
            
    }
    
}

 

 

순서대로 쓰자면

 

 

1. SendDataViewController

받을 데이터의 라벨, 변수(프로퍼티) 추가

    @IBOutlet weak var dataLabel: UILabel!
    var data : String?

 

2.ViewController

prepare 메서드로 보낼 화면을 정의하고 데이터를 저장

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? SendDataViewController {
            vc.data = "1->2 보내는 데이터"
        }   
    }

 

3. SendDataViewController

데이터를 받기 (표시하기)

    override func viewDidLoad() {
        super.viewDidLoad()
        if let data = data {
            self.dataLabel.text = data
            self.dataLabel.sizeToFit()
        }
    }

 


 

두번째 화면 -> 첫번째 화면  (>>이전화면에서 데이터 받아오기)

 

두번째화면

타입이 프로토콜인 프로퍼티 생성, delegate 사용

import UIKit

protocol SendDataDelegate:AnyObject {
    func sendData (_ sendDataLabel: String)
}

class SendDataViewController: UIViewController {

    @IBOutlet weak var dataLabel: UILabel!
    var data : String?
    
    weak var delegate:SendDataDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let data = data {
            self.dataLabel.text = data
            self.dataLabel.sizeToFit()
        }
    }
    
    @IBAction func PreviousPrevioustapPreviousButton(_ sender: UIButton) {
        self.delegate?.sendData("2->1 으로 보내는 데이터")
        // 이전화면으로
        self.navigationController?.popViewController(animated: true)
    }
    
}

 

 

첫번째화면

프로토콜채택, 실제구현, 대리자 위임(이전화면에서 올때 받는 데이터)

import UIKit

class ViewController: UIViewController, SendDataDelegate {

    @IBOutlet weak var dataLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func tapNextButton(_ sender: UIButton) {
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? SendDataViewController {
            vc.data = "1->2 보내는 데이터"
            
            //이전화면에서 오는 데이터
            vc.delegate = self
        }
    }
    
    // 프로토콜 채택 후  정의하기
    func sendData(_ sendDataLabel: String) {
        dataLabel.text = sendDataLabel
        dataLabel.sizeToFit()
    }
    

    
}

 

 

 

순서대로 쓰자면

 

 

1. 두번째 화면 -> 타입이 프로토콜인 프로퍼티 생성

protocol SendDataDelegate:AnyObject {
    func sendData (_ sendDataLabel: String)
}

2. 두번째 화면 -> delegate 사용 

정의한 프로토콜을 delegate 프로퍼티에 인스턴스화 var 앞에 붙은 weak는 메모리 누수 방지를 위한 것

    weak var delegate:SendDataDelegate?
    
    @IBAction func PreviousPrevioustapPreviousButton(_ sender: UIButton) {
        self.delegate?.sendData("2->1 으로 보내는 데이터")
        // 이전화면으로
        self.navigationController?.popViewController(animated: true)
    }

 

3. 첫번째 화면 -> 프로토콜 채택

class ViewController: UIViewController, SendDataDelegate {

4. 첫번째 화면 -> 실제 구현

    // 프로토콜 채택 후 구현
    func sendData(_ sendDataLabel: String) {
        dataLabel.text = sendDataLabel
        dataLabel.sizeToFit()
    }

5. 첫번째 화면 -> 대리자 위임 (이전 화면에서 오는 데이터 데이터 받기 표시)

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
 
        if let vc = segue.destination as? SendDataViewController {
            vc.data = "1->2 보내는 데이터"
            
            //대리자 위임 / 이전화면에서 오는 데이터
            vc.delegate = self
        }
    }

1->2 로 보내는 화면에서는

prepare 메서드를 1번 화면에서 작성한다 여기서 2번째 화면을 찾고 데이터를 저장함

2번 화면에서는 prepare 받은 데이터를 표시만함

 

2->1 로 보내는 화면은 많이 사용한다는 delegate 사용

프로토콜을 이용해야하고 2번이나 1번에서 프로토콜을 생성함 class 밖에서 생성하면 됨

2번에서 1번으로 보내기 때문에 프로토콜 안에 만든 메서드(함수) 안에 프로토콜로 재정의한 델리게이트 변수안에 저장

저장한 델리게이트 변수를 1번 화면에서 프로토콜을 채택하고 함수를 재정의해서 표시될 내용을 작성하고 프로토콜 대리자를 위임한다

 

이전화면으로 데이터를 보내는 내용이 너무 어렵고 자꾸 헤메게되는거 같아서 다시정리했다.

반응형
Comments