Swift 5
Nun, die Antwort von Matt Price ist vollkommen in Ordnung, um Daten weiterzugeben, aber ich werde sie in der neuesten Swift-Version neu schreiben, da ich glaube, dass neue Programmierer es aufgrund neuer Syntax und Methoden / Frameworks als schwierig empfinden, da der ursprüngliche Beitrag in Objective-C enthalten ist.
Es gibt mehrere Optionen zum Übergeben von Daten zwischen View Controllern.
- Verwenden des Navigationscontrollers Push
- Segue verwenden
- Delegate verwenden
- Benachrichtigungsbeobachter verwenden
- Block verwenden
Ich werde seine Logik in Swift mit dem neuesten iOS Framework umschreiben
Daten über Navigation Controller übertragen Push : Von ViewControllerA zu ViewControllerB
Schritt 1. Deklarieren Sie die Variable in ViewControllerB
var isSomethingEnabled = false
Schritt 2. Druckvariable in der ViewDidLoad-Methode von ViewControllerB
override func viewDidLoad() {
super.viewDidLoad()
//Print value received through segue, navigation push
print("Value of 'isSomethingEnabled' from ViewControllerA : ", isSomethingEnabled)
}
Schritt 3. Übergeben Sie in ViewControllerA Daten, während Sie durch Navigation Controller drücken
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)
}
}
Hier ist der vollständige Code für:
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)
}
}
Übergeben von Daten durch Segue : Von ViewControllerA zu ViewControllerB
Schritt 1. Erstellen Sie einen Segue von ViewControllerA zu ViewControllerB und geben Sie Identifier = showDetailSegue im Storyboard wie unten gezeigt ein
Schritt 2. Deklarieren Sie in ViewControllerB einen brauchbaren Namen mit dem Namen isSomethingEnabled und drucken Sie seinen Wert aus.
Schritt 3. In ViewControllerA übergeben Sie den Wert von SomethingEnabled, während Sie Segue übergeben
Hier ist der vollständige Code für:
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)
}
}
Übergeben von Daten durch Delegate : Von ViewControllerB zu ViewControllerA
Schritt 1. Deklarieren Sie das Protokoll ViewControllerBDelegate in der ViewControllerB-Datei, jedoch außerhalb der Klasse
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?)
}
Schritt 2. Deklarieren Sie die Delegate-Variableninstanz in ViewControllerB
var delegate: ViewControllerBDelegate?
Schritt 3. Senden Sie Daten für den Delegaten innerhalb der viewDidLoad-Methode von ViewControllerB
delegate?.addItemViewController(self, didFinishEnteringItem: "Data for ViewControllerA")
Schritt 4. Bestätigen Sie ViewControllerBDelegate in ViewControllerA
class ViewControllerA: UIViewController, ViewControllerBDelegate {
// to do
}
Schritt 5. Bestätigen Sie, dass Sie delegate in ViewControllerA implementieren
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)
}
}
Schritt 6. Implementieren Sie die Delegate-Methode zum Empfangen von Daten in ViewControllerA
func addItemViewController(_ controller: ViewControllerB?, didFinishEnteringItem item: String?) {
print("Value from ViewControllerB's Delegate", item!)
}
Hier ist der vollständige Code für:
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")
}
}
Übergeben von Daten durch Notification Observer : Von ViewControllerB zu ViewControllerA
Schritt 1. Daten in Notification Observer in ViewControllerB festlegen und veröffentlichen
let objToBeSent = "Test Message from Notification"
NotificationCenter.default.post(name: Notification.Name("NotificationIdentifier"), object: objToBeSent)
Schritt 2. Fügen Sie Notification Observer in ViewControllerA hinzu
NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("NotificationIdentifier"), object: nil)
Schritt 3. Benachrichtigungsdatenwert in ViewControllerA empfangen
@objc func methodOfReceivedNotification(notification: Notification) {
print("Value of notification : ", notification.object ?? "")
}
Hier ist der vollständige Code für:
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)
}
}
Übergeben von Daten durch Block : Von ViewControllerB zu ViewControllerA
Schritt 1. Deklarieren Sie den Block in ViewControllerB
var authorisationCompletionBlock: ((Bool) -> ())? = {_ in}
Schritt 2. Legen Sie die Daten im Block in ViewControllerB fest
if authorizationCompletionBlock != nil
{
authorizationCompletionBlock!(true)
}
Schritt 3. Blockdaten in ViewControllerA empfangen
//Receiver Block
controller!.authorizationCompletionBlock = { isGranted in
print("Data received from Block is :", isGranted)
}
Hier ist der vollständige Code für:
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)
}
}
}
Eine vollständige Beispielanwendung finden Sie auf meinem GitHub. Bitte lassen Sie mich wissen, wenn Sie Fragen dazu haben.
@class ViewControllerB;
@ über die @ protocol-Definition setzen? Ohne es erhalte ich einen Fehler "Erwarteter Typ" auf ViewControllerB in der Zeile:- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item;
innerhalb der@protocol
Deklaration