////
Search
🎡

Passing Data

본 글에서는 Swift 기반의 iOS Application에서 화면 이동 시 데이터 전달 방법에 대해 다룹니다.

1. Instance Property

프로퍼티를 통해 데이터를 전달하는 가장 기본이 되는 방법입니다.
ViewController의 Indentifier값을 참조하여 데이터를 전달하게 됩니다.
아래 코드는 nib을 사용한 예시입니다.
// Main ViewController Code import UIKit class ViewController: UIViewController { @IBAction func moveToDetail(_ sender: Any) { let detailVC = DetailViewController(nibName: "DetailViewController", bundle: nil) detailVC.someString = "aaa 스트링" self.present(detailVC, animated: true, completion: nil) } }
Swift
복사
// Instance Property ViewController Code import UIKit class DetailViewController: UIViewController { var someString: String = "" @IBOutlet weak var someLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() someLabel.text = someString } }
Swift
복사

2. Segue

하나의 StoryBoard 내 여러 ViewController가 존재할 때 주로 사용합니다.
Segue Indentifier 값을 통해 데이터를 전달하게 됩니다.
// Main ViewController Code import UIKit class ViewController: UIViewController { override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "segueDetail" { if let detailVC = segue.destination as? SegueDetailViewController { detailVC.dataString = "abcd" } } } }
Swift
복사
// Segue ViewController Code import UIKit class SegueDetailViewController: UIViewController { @IBOutlet weak var dataLabel: UILabel! var dataString: String = "" override func viewDidLoad() { super.viewDidLoad() dataLabel.text = dataString } }
Swift
복사

3. Instance

반대로 MainViewController 인스턴스 자체를 넘겨주어서 데이터를 전달 받는 형태에 대해서 다루어보겠습니다.
// Main ViewController Code import UIKit class ViewController: UIViewController { @IBOutlet weak var dataLabel: UILabel! @IBAction func moveToInstance(_ sender: Any) { let detailVC = InstanceDetailViewController(nibName: "InstanceDetailViewController", bundle: nil) detailVC.mainVC = self self.present(detailVC, animated: true, completion: nil) } }
Swift
복사
// Instance Detail ViewController Code import UIKit class InstanceDetailViewController: UIViewController { var mainVC: ViewController? override func viewDidLoad() { super.viewDidLoad() } @IBAction func sendDataMainVc(_ sender: Any) { mainVC?.dataLabel.text = "some data" self.dismiss(animated: true) } }
Swift
복사

4. Delegate

Delegate Pattern은 iOS 구현에서 많이 사용하는 방법 중 하나입니다.
마찬가지로 MainViewController가 데이터를 전달 받는 방향으로 진행하겠습니다.
Delegate Pattern을 통해 데이터를 전달 할 때 데이터를 전달하고자 하는 ViewController에서 Delegate Protocol을 정의하게 됩니다.
그리고 데이터를 전달 받고자 하는 ViewController에서 해당 protocol을 채택함으로써 데이터를 전달할 수 있겠습니다.
// Main ViewController Code import UIKit class ViewController: UIViewController { @IBOutlet weak var dataLabel: UILabel! @IBAction func moveToDelegate(_ sender: Any) { let detailVC = DelegateDetailViewController(nibName: "DelegateDetailViewController", bundle: nil) detailVC.delegate = self self.present(detailVC, animated: true, completion: nil) } }
Swift
복사
// Delegate ViewController Code import UIKit protocol DelegateDetailViewControllerDelegate: AnyObject { func passString(string: String) } class DelegateDetailViewController: UIViewController { weak var delegate: DelegateDetailViewControllerDelegate? override func viewDidLoad() { super.viewDidLoad() } @IBAction func passDataToMainVC(_ sender: Any) { delegate?.passString(string: "delegate pass data") self.dismiss(animated: true, completion: nil) } }
Swift
복사

5. Closure

클로저는 코드 블록을 실행하는 함수와 유사한 형태입니다.
마찬가지로 MainViewController가 데이터를 전달받는 방향으로 진행하도록 하겠습니다.
// Main ViewController Code import UIKit class ViewController: UIViewController { @IBOutlet weak var dataLabel: UILabel! @IBAction func moveToClosure(_ sender: Any) { let detailVC = ClosureDetailViewController(nibName: "ClosureDetailViewController", bundle: nil) detailVC.myClosure = { str in self.dataLabel.text = str } self.present(detailVC, animated: true, completion: nil) } }
Swift
복사
// Closure ViewController Code import UIKit class ClosureDetailViewController: UIViewController { var myClosure: ((String) -> Void)? override func viewDidLoad() { super.viewDidLoad() } @IBAction func closurePassData(_ sender: Any) { myClosure?("closure string") self.dismiss(animated: true) } }
Swift
복사

6. Notification

Notification을 통해 화면 간 데이터 전달 방법에 대해 다루어보겠습니다.
마찬가지로 MainViewController가 데이터를 전달받는 방향으로 진행하도록 하겠습니다.
// Main ViewController Code import UIKit class ViewController: UIViewController { @IBOutlet weak var dataLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() let notificationName = Notification.Name("sendSomeString") NotificationCenter.default.addObserver(self, selector: #selector(showSomeString), name: notificationName, object: nil) } @IBAction func moveToNotification(_ sender: Any) { let detailVC = NotificationDetailViewController(nibName: "NotificationDetailViewController", bundle: nil) self.present(detailVC, animated: true, completion: nil) } @objc func showSomeString(notification: Notification) { if let str = notification.userInfo?["str"] as? String { self.dataLabel.text = str } } }
Swift
복사
// Notification ViewController Code import UIKit class NotificationDetailViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func notiAction(_ sender: Any) { let notificationName = Notification.Name("sendSomeString") let strDic = ["str" : "noti string"] NotificationCenter.default.post(name: notificationName, object: nil, userInfo: strDic) self.dismiss(animated: true) } }
Swift
복사