본 글에서는 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
복사