본문 바로가기

Mobile/IOS & Swift

swift 뷰컨트롤러간 데이터 전달

swift view 데이터 통신

A->B->C 형태의 뷰 컨트롤러로 진행

A에서 B로 갈때 그리고 B에서 A로 갈때 스토리보드상 ctrl + 드래그를 통한 show를 이용할 경우
게속 스택 위에 뷰를 쌓는 형태가 되므로 메모리에 매우 좋지않다 그러므로 A->B로 갈때 show를 사용한 후
B에서 A로 돌아갈땐 dismiss를 이용하자.

//예시 in B of view controller
dismiss(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 conroller
override 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: Int
var myProperty: Int {
   get {
      return _myProperty
   }
   set(newVal) {
      _myProperty = newVal
   }
}
 
 

_myProperty는 실제로 값이 저장되는 변수입니다. 외부에서 myProperty의 값에 접근하거나 새로운 값을 할당하면 실제로 값이 저장되는 곳은 myProperty가 아닌 _myProperty입니다. 즉 myProperty는 _myProperty의 interface역할을 합니다.