swift view 데이터 통신
A->B->C 형태의 뷰 컨트롤러로 진행
A에서 B로 갈때 그리고 B에서 A로 갈때 스토리보드상 ctrl + 드래그를 통한 show를 이용할 경우
게속 스택 위에 뷰를 쌓는 형태가 되므로 메모리에 매우 좋지않다 그러므로 A->B로 갈때 show를 사용한 후
B에서 A로 돌아갈땐 dismiss를 이용하자.
//예시 in B of view controllerdismiss(animated: true, completion: nil)
B(데이터보냄)->C(데이터받음)
/in B@IBAction func loadThirdScreenPressed(_ sender: AnyObject) {///버튼을 누를경우 songTitle이 전송되는 방식이며 performSegue를//통해 불러오기를 실행한다.let songTitle = "Quit Playing Games With My Heart"performSegue(withIdentifier: "PlaySongVC", sender: songTitle)}
그리고 세그웨이를 토앟여 데이터를 넘길땐 prepare for segue를 이용한다.
prepareForSegue는 세그 이동하는 경우에는 무조건 실행이 되므로 identifier로 분기하도록 하자.
예시)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {if segue.identifier == "ShowCounterSegue"{if let destinationVC = segue.destinationViewController as? OtherViewController {destinationVC.numberToDisplay = counter}}}
본론으로 돌아와서 B 에서 값을 넘겨줄때 해당 값들을 미리 정의해주자
아래를 보면 destination값이 PlaySongVC로 변환될 수 있다면 true값을 반환하고 destination에 참조값을
반환하고 그렇지 않을경우 false가 되게 된다.
in B conrolleroverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {// playSongVC 값을 playSongVC 형태로 가져와 destination에 넣고// 그 값이 있을 경우 아래 블록을 실행한다.// 그 후 String 값으로 sender을 가져와 song에 넣은 후//목표가 되는 컨트롤러의 selectedSong에 값을 넣는다.if let destination = segue.destination as? PlaySongVC {if let song = sender as? String {destination.selectedSong = song}}}
in C 컨트롤러
var selectedSong: String {get {return _selectedSong} set {//selectedSong = val을 할경우//실제로 데이터가 들어가는 곳은 _selectedSong이다//즉 selectSong은 외부에서 이용할 때고 내부에선 언더바를 이용하여 사용하게 된다._selectedSong = newValue}}override func viewDidLoad() {super.viewDidLoad()songTitleLbl.text = _selectedSong}
정리
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {if let destination = segue.destination as? 이동할 뷰 컨트롤러 {if let song = sender as? String {destination.접근할 데이터 = song(넘겨줄 데아터)}}}
if let은 optional을 safety하게 unwrapiing하기 위한 요소이다.
번외
var _myProperty: Intvar myProperty: Int {get {return _myProperty}set(newVal) {_myProperty = newVal}}
_myProperty는 실제로 값이 저장되는 변수입니다. 외부에서 myProperty의 값에 접근하거나 새로운 값을 할당하면 실제로 값이 저장되는 곳은 myProperty가 아닌 _myProperty입니다. 즉 myProperty는 _myProperty의 interface역할을 합니다.