2016-04-09 6 views
0

Ich habe eine App, bei der Sie Daten in einem modalen UIViewController an mehreren Orten in der App auswählen müssen. Stellen Sie sich folgendes vor: Sie möchten sehen, ob ein Restaurant über verfügbare Tische verfügt -> ein Modal UIViewController erscheint, wo Sie ein Restaurant in einer Liste auswählen, das es ablehnt und die Daten an die präsentierende Ansicht zurückgibt. Sie möchten verwandte Restaurants sehen -> Ein Modal UIViewController erscheint, wo Sie ein Restaurant in einer Liste auswählen, das es ablehnt und die Daten zurück zur präsentierenden Ansicht übermittelt. Usw.Präsentieren Sie UIViewController und geben Sie Daten an die präsentierende Ansicht zurück.

Jetzt könnte ich dies tun, indem Sie RestaurantViewController.delegate = self in der präsentierenden Ansicht setzen. Ich könnte dann etwas wie [delegate pickedRestaurant:restaurant]; nennen, aber ich mag es nicht, wie ungenerisch das ist.

Gibt es eine andere Möglichkeit, eine UIViewController mit einem Datenrückruf zu präsentieren?

+0

Was meinst du damit, dass das Delegatenmuster "ungenerisch" ist? Genau dafür ist das Muster ausgelegt, um sicherzustellen, dass der vorgestellte View-Controller sich nur mit seiner eigenen Implementierung beschäftigt; Delegierte können dann auf diesen Rückruf nach Bedarf antworten, ohne die Verantwortlichkeiten des Kind-Controllers zu beeinflussen. – Stuart

+0

Nun, @Stuart, was ich meinte war, dass ich den gleichen Code mehrmals implementieren muss. Aber nach eingehender Forschung stimme ich zu, dass dies die beste Option für mich ist. – user4992124

Antwort

2

Ein Entwurfsmuster delegate ist nützlich, wenn Sie Daten an die präsentierende UIViewController zurückgeben möchten, wie Sie in Ihrer Frage hingewiesen haben. Wenn Sie das Designmuster für die Delegierung nicht ablehnen möchten, können Sie vielleicht NSNotificationCenter verwenden? Es speichert nicht viel Speicher und löst eine App-weite Übertragung aus, die von einem NSObserver aufgenommen werden kann, den Sie in Ihre Präsentation einfügen können UIViewController (vorausgesetzt, dass Ihre Präsentation UIViewController noch im Speicher ist. Zum Beispiel können die Codes aussehen etwas entlang der Linien von dieser:

ViewControllerA.swift

override func viewDidLoad(){ 
super.viewDidLoad() 
let notifCenter = NSNotificationCenter.defaultCenter() 
notifCenter.addObserver(self, selector: #selector(ViewControllerA.methodToTrigger), name: "pickedRestaurantNoti", object: nil) 
} 

func methodToTrigger(notification:NSNotification){ 

    let userInfo:Dictionary<String,String!> = notification.userInfo as Dictionary<String,String!> 
    let pickedRestaurantFromB = userInfo["pickedRestaurant"] 
    // pickedRestaurantFromB should have the value of "Restaurant 1" 
    // handle that value now that you have gotten it 

} 

ViewControllerB.swift

func someMethod(){ 
let notifCenter = NSNotificationCenter.defaultCenter() 
notifCenter.postNotificationName("pickedRestaurantNoti", 
         object:nil, 
         userInfo:["pickedRestaurant":"Restaurant 1"]) 
} 
-1

Angenommen, es gibt zwei vc A und B.

hinzufügen Immobilie in Bh als

@property A *aobjet 

und Eigentum in Ah als

@property NSString *str; 

, wenn Sie vorhanden B Aufruf wie folgt aus Am

B *b = [B alloc]init]; 
[self presentViewController:B animated:YES completion:^{ 
    b.aobject = self; 

}]; 

dann gesetzt Eigenschaft von A vor Pop aus B.m zum Beispiel String,

self.aobject.str = @"your data"; 
[[self.navigationController popViewController animated:YES]; 

Bitte vermeiden Syntaxfehler falls vorhanden, weil ich es hier eingegeben haben.!

Verwandte Themen