Hızlı 5
Peki Matt Price'ın Cevabı veri geçmek için gayet iyi ama en son Swift sürümünde yeniden yazacağım çünkü yeni programcıların yeni sözdizimi ve yöntemler / çerçeveler nedeniyle zorlu çıktığını düşünüyoruz, çünkü orijinal yazı Objective-C'de.
Görünüm Denetleyicileri Arasında Veri Aktarmak için birden fazla seçenek vardır.
- Gezinti Denetleyicisini Kullanma
- Segue Kullanımı
- Temsilci Kullanma
- Bildirim Gözlemcisini Kullanma
- Bloğu Kullanma
Swift'teki mantığını en son iOS Framework ile yeniden yazacağım
Verileri Gezinti Denetleyicisinden Aktarma Push : ViewControllerA'dan ViewControllerB'ye
Adım 1. ViewControllerB'de değişken bildirme
var isSomethingEnabled = false
Adım 2. ViewControllerB 'ViewDidLoad yönteminde Değişkeni Yazdır
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through segue, navigation push
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
Adım 3. ViewControllerA'da Verileri Gezinti Kontrol Cihazına aktarırken aktarın
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.isSomethingEnabled = true
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
İşte tam kod:
ViewControllerA
import UIKit
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK:Passing Data through Navigation PushViewController
@IBAction func goToViewControllerB(_ sender: Any) {
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.isSomethingEnabled = true
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
}
}
ViewControllerB
import UIKit
class ViewControllerB: UIViewController {
//MARK: - Variable for Passing Data through Navigation push
var isSomethingEnabled = false
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through navigation push
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
}
Segue ile Veri Aktarma : ViewControllerA'dan ViewControllerB'ye
Adım 1. ViewControllerA'dan ViewControllerB'ye Segue oluşturun ve Storyboard'da aşağıda gösterildiği gibi Identifier = showDetailSegue verin
2. Adım. ViewControllerB'de isSomethingEnabled adlı geçerli bir değer bildirin ve değerini yazdırın.
Adım 3. ViewControllerA'da Segue iletilirken isSomethingEnabled'ın değeri
İşte tam kod:
ViewControllerA
import UIKit
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - - Passing Data through Segue - -
@IBAction func goToViewControllerBUsingSegue(_ sender: Any) {
performSegue(withIdentifier: "showDetailSegue", sender: nil)
}
//Segue Delegate Method
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "showDetailSegue") {
let controller = segue.destination as? ViewControllerB
controller?.isSomethingEnabled = true//passing data
}
}
}
ViewControllerB
import UIKit
class ViewControllerB: UIViewController {
var isSomethingEnabled = false
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through segue
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
}
Delege ile Veri Aktarma : ViewControllerB'den ViewControllerA'ya
Adım 1. ViewControllerB dosyasında ancak sınıf dışında Protokol ViewControllerBDelegate bildir
protocol ViewControllerBDelegate: NSObjectProtocol {
// Classes that adopt this protocol MUST define
// this method -- and hopefully do something in
// that definition.
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
}
Adım 2. ViewControllerB'de değişken örneği temsilci olarak bildirin
var delegate: ViewControllerBDelegate?
Adım 3. ViewControllerB viewDidLoad yöntemi içinde temsilci için veri gönderme
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
Adım 4. ViewControllerA'da ViewControllerBDelegate'i onaylayın
class ViewControllerA: UIViewController, ViewControllerBDelegate {
// to do
}
Adım 5. ViewControllerA'da temsilci uygulayacağınızı onaylayın
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.delegate = self//confirming delegate
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
Adım 6. ViewControllerA'da veri almak için temsilci yöntemi uygulayın
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
print("Value from ViewControllerB's Delegate", item!)
}
İşte tam kod:
ViewControllerA
import UIKit
class ViewControllerA: UIViewController, ViewControllerBDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
//Delegate method
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
print("Value from ViewControllerB's Delegate", item!)
}
@IBAction func goToViewControllerForDelegate(_ sender: Any) {
if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {
viewControllerB.delegate = self
if let navigator = navigationController {
navigator.pushViewController(viewControllerB, animated: true)
}
}
}
}
ViewControllerB
import UIKit
//Protocol decleare
protocol ViewControllerBDelegate: NSObjectProtocol {
// Classes that adopt this protocol MUST define
// this method -- and hopefully do something in
// that definition.
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?)
}
class ViewControllerB: UIViewController {
var delegate: ViewControllerBDelegate?
override func viewDidLoad() {
super.viewDidLoad()
//MARK: - - - - Set Data for Passing Data through Delegate - - - - - -
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
}
}
Verileri Bildirim Gözlemcisinden Aktarma : ViewControllerB'den ViewControllerA'ya
Adım 1. ViewControllerB'de Bildirim gözlemcisindeki verileri ayarlayın ve kaydedin
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
Adım 2. ViewControllerA'da Bildirim Gözlemcisi ekleyin
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
Adım 3. ViewControllerA'da Bildirim veri değerini alma
@objc func methodOfReceivedNotification(notification: Notification) {
print("Value of notification : ", notification.object ?? "")
}
İşte tam kod:
ViewControllerA
import UIKit
class ViewControllerA: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
// add observer in controller(s) where you want to receive data
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
}
//MARK: Method for receiving Data through Post Notification
@objc func methodOfReceivedNotification(notification: Notification) {
print("Value of notification : ", notification.object ?? "")
}
}
ViewControllerB
import UIKit
class ViewControllerB: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//MARK:Set data for Passing Data through Post Notification
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
}
}
Bloktan Veri Aktarma : ViewControllerB'den ViewControllerA'ya
Adım 1. ViewControllerB'de bloğu bildirin
var authorizationCompletionBlock: ((Bool) -> ())? = {_ inç}
Adım 2. ViewControllerB'de blok halinde veri ayarlama
if authorizationCompletionBlock != nil
{
authorizationCompletionBlock!(true)
}
Adım 3. ViewControllerA'da blok verilerini alma
//Receiver Block
controller!.authorizationCompletionBlock = { isGranted in
print("Data received from Block is :", isGranted)
}
İşte tam kod:
ViewControllerA
import UIKit
class ViewControllerA: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK:Method for receiving Data through Block
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "showDetailSegue") {
let controller = segue.destination as? ViewControllerB
controller?.isSomethingEnabled = true
//Receiver Block
controller!.authorizationCompletionBlock = { isGranted in
print("Data received from Block is :", isGranted)
}
}
}
}
ViewControllerB
import UIKit
class ViewControllerB: UIViewController {
//MARK:Variable for Passing Data through Block
var authorizationCompletionBlock:((Bool)->())? = {_ in}
override func viewDidLoad() {
super.viewDidLoad()
//MARK:Set data for Passing Data through Block
if authorizationCompletionBlock != nil
{
authorizationCompletionBlock!(true)
}
}
}
GitHub'ımda tam bir örnek uygulama bulabilirsiniz . Bu konuda herhangi bir sorunuz olursa lütfen bize bildirin.
@class ViewControllerB;
@protocol tanımının üstüne koymamız gerekiyor mu? Onsuz satırda ViewControllerB bir "Beklenen tip" hatası alıyorum: bildirimi- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
içinde@protocol