일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 한글입력 안됨
- 제이쿼리연결
- 기획자랑 사이좋게 지내고 싶다
- 제이펍 출판
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- 한글입력 오류
- max apache
- 맥 아파치
- 자바스크립트 class
- python tkinter 인터페이스
- python GUI 사용하기
- 한글입력 잘림
- 객체지향
- 자바스크립트
- 비주얼스튜디오 코드
- 생활코딩
- 블록 스코프
- 맥 mysql
- 자바스크립트 객체
- 배열 분해 할당
- 황반석 옮김
- jquery 사용하기
- 한글잘림
- max MySQL
- 자바스크립트 객체 만들기
- 객체
- 닐 스미스 지음
- 자바스크립트 배열 할당
- 한글입력 씹힘
- SwiftUI 기반의 iOS 프로그래밍
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 한글입력 안됨
- 제이쿼리연결
- 기획자랑 사이좋게 지내고 싶다
- 제이펍 출판
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- 한글입력 오류
- max apache
- 맥 아파치
- 자바스크립트 class
- python tkinter 인터페이스
- python GUI 사용하기
- 한글입력 잘림
- 객체지향
- 자바스크립트
- 비주얼스튜디오 코드
- 생활코딩
- 블록 스코프
- 맥 mysql
- 자바스크립트 객체
- 배열 분해 할당
- 황반석 옮김
- jquery 사용하기
- 한글잘림
- max MySQL
- 자바스크립트 객체 만들기
- 객체
- 닐 스미스 지음
- 자바스크립트 배열 할당
- 한글입력 씹힘
- SwiftUI 기반의 iOS 프로그래밍
- Today
- Total
java,javascript,android,php,sql,공부용,메모용
화면간 데이터전달 다시 정리하기.. / segue 화면전환 delegate 데이터전달 본문
화면간 데이터 전달은 중요한거 같아서 다시 정리했다.
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번 화면에서 프로토콜을 채택하고 함수를 재정의해서 표시될 내용을 작성하고 프로토콜 대리자를 위임한다
이전화면으로 데이터를 보내는 내용이 너무 어렵고 자꾸 헤메게되는거 같아서 다시정리했다.
'모바일 > SwiftUI ios 공부' 카테고리의 다른 글
테이블뷰 TableView / UITableView, UITableDataSource, UITableDelegate / Xcode SwiftUI (0) | 2021.12.10 |
---|---|
계산기앱 기본적인 계산 / 프로퍼티에 값 저장/ 열거형 사용 (0) | 2021.12.06 |
화면간 데이터 전달 / Xcode SwiftUI (0) | 2021.12.02 |
ViewController 생명주기,수명주기 ViewController Life Cycle 화면전환 / Xcode SwiftUI 앱맨들기 (0) | 2021.12.01 |
ViewController , 코드와 세그웨이 화면전환code, Segue로 화면전환 해보기 / Xcode SwiftUI 앱맨들기 (0) | 2021.12.01 |