Transmettre datatables au controller de vue précédent

J'essaie de transmettre des données BACK TO previous viewController.

Est-ce que quelqu'un sait comment transmettre des données de ViewController B à ViewController A? Je veux donc qu'une string passe de 'BIDAddTypeOfDealViewController à BIDDCCreateViewController. Un user édite viewController B et je veux que datatables éditées soient de nouveau dans ViewController A où je l'utilise ensuite.

J'utilise la section «transmettre des données» de cette réponse . En quoi le mien diffère-t-il? Les points 3 et 6 mentionnent juste quand les vues apparaissent, donc j'ai mis ce code dans viewWillDisappear. Je pense que c'est correct? Aussi sur le point 6 je n'ai pas initialisé avec la plume comme c'est vieux. J'utilise des storyboards. Et je n'ai pas ajouté cette dernière ligne car je ne crois pas que je devrais la pousser. Appuyer sur un button de mon storyboard me fait déjà avancer.

Je pense que le problème peut survenir dans BIDDCCreateViewController, j'ai la méthode mais je ne peux pas l'exécuter. Pour exécuter une méthode, elle devrait aller [self method]. Je suis incapable de faire ça. Eh bien c'est juste ce que je devine.

Il comstack et fonctionne bien, rien n'est enregistré, donc je ne sais pas si cela fonctionne.

UPDATE: Je n'arrive pas à exécuter la méthode 'sendDataToA'.

#import <UIKit/UIKit.h> #import "BIDAddTypeOfDealViewController.h" @interface BIDDCCreateViewController : UIViewController @property (strong, nonatomic) NSSsortingng *placeId; - (IBAction)gotoBViewController:(id)sender; @end #import "BIDDCCreateViewController.h" #import "BIDAddTypeOfDealViewController.h" @implementation BIDDCCreateViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId); } -(void)sendDataToA:(NSSsortingng *)mySsortingngData { NSLog(@"Inside sendDataToA"); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Your ssortingng Data Showing" message:mySsortingngData delegate:self cancelButtonTitle:@"Ok " otherButtonTitles:nil]; [alert show]; } - (IBAction)gotoBViewController:(id)sender { NSLog(@"pressed"); BIDAddTypeOfDealViewController *bidAddType = [[BIDAddTypeOfDealViewController alloc]init]; bidAddType.delegate = self; } @end @protocol senddataProtocol <NSObject> -(void)sendDataToA:(NSSsortingng *)mySsortingngData; @end #import <UIKit/UIKit.h> @interface BIDAddTypeOfDealViewController : UIViewController <UITextFieldDelegate>//Using this delegate for data a user inputs @property(nonatomic,assign)id delegate; //other textfield outlets not relevant - (IBAction)chooseDiscountDeal:(id)sender; @end #import "BIDAddTypeOfDealViewController.h" @interface BIDAddTypeOfDealViewController () @end @implementation BIDAddTypeOfDealViewController @synthesize delegate; - (id)initWithNibName:(NSSsortingng *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; } -(void)viewWillDisappear:(BOOL)animated { [delegate sendDataToA:@"Apple"]; } @end 

Vous pouvez utiliser un délégué. Donc, dans votre ViewController B, vous devez créer un protocole qui renvoie datatables à votre ViewController A. Votre ViewController A devient un délégué de ViewController B.

Si vous êtes nouveau à l'objective C, veuillez regarder Qu'est-ce qu'un délégué ?

Créez un protocole dans ViewControllerB.h:

 #import <UIKit/UIKit.h> @protocol senddataProtocol <NSObject> -(void)sendDataToA:(NSArray *)array; //I am thinking my data is NSArray, you can use another object for store your information. @end @interface ViewControllerB : UIViewController @property(nonatomic,assign)id delegate; 

ViewControllerB.m

 @synthesize delegate; -(void)viewWillDisappear:(BOOL)animated { [delegate sendDataToA:yourdata]; } 

dans votre ViewControllerA: quand vous allez à ViewControllerB

 ViewControllerA *acontollerobject=[[ViewControllerA alloc] initWithNibName:@"ViewControllerA" bundle:nil]; acontollerobject.delegate=self; // protocol listner [self.navigationController pushViewController:acontollerobject animated:YES]; 

et définissez votre fonction:

 -(void)sendDataToA:(NSArray *)array { // data will come here inside of ViewControllerA } 

Édité:

Vous pouvez voir cet exemple: Comment vous pouvez renvoyer datatables au viewcontroller précédent: Lien tutoriel

Une méthode plus courte et plus simple que protocol / delegate est de créer une fermeture:

Pour renvoyer une string dans mon cas. Dans ViewControllerA:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let viewControllerB = segue.destination as? ViewControllerB { viewControllerB.callback = { message in //Do what you want in here! } } } 

Dans ViewControllerB:

 var callback : ((Ssortingng) -> Void)? @IBAction func done(sender: AnyObject) { callback?("Hi") self.dismiss(animated: true, completion: nil) } 

Swift: renvoyer des données en utilisant le model de délégué

Ma réponse complète qui couvre datatables de passage dans les deux sens est ici . Ma réponse expliquant le model de délégué est ici .

Pour renvoyer des données du second controller de vue au premier controller de vue, vous utilisez un protocole et un délégué. Cette video est une marche très claire cependant de ce process:

  • Didacticiel YouTube: Didacticiel sur les bases de Swift iOS: Protocoles et delegates . Mais lisez aussi cet article pour vous assurer de ne pas entrer dans un cycle de reference fort.

Ce qui suit est un exemple basé sur la video (avec quelques modifications).

entrez la description de l'image ici

Créez la disposition du storyboard dans l'interface Builder. Encore une fois, pour faire le segue, il vous suffit de faire glisser le button depuis le button vers le second controller de vue. Définissez l'identificateur de segue sur showSecondViewController . Aussi, n'oubliez pas de twigr les sockets et les actions en utilisant les noms dans le code suivant.

Premier controller de vue

Le code du First View Controller est

 import UIKit class FirstViewController: UIViewController, DataEnteredDelegate { @IBOutlet weak var label: UILabel! override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showSecondViewController" { let secondViewController = segue.destinationViewController as! SecondViewController secondViewController.delegate = self } } func userDidEnterInformation(info: Ssortingng) { label.text = info } } 

Notez l'utilisation de notre protocole DataEnteredDelegate personnalisé.

Deuxième controller de vue et protocole

Le code du second controller de vue est

 import UIKit // protocol used for sending data back protocol DataEnteredDelegate: class { func userDidEnterInformation(info: Ssortingng) } class SecondViewController: UIViewController { // making this a weak variable so that it won't create a strong reference cycle weak var delegate: DataEnteredDelegate? = nil @IBOutlet weak var textField: UITextField! @IBAction func sendTextBackButton(sender: UIButton) { // call this method on whichever class implements our delegate protocol delegate?.userDidEnterInformation(textField.text!) // go back to the previous view controller self.navigationController?.popViewControllerAnimated(true) } } 

Notez que le protocol est en dehors de la class View Controller.

C'est tout. En cours d'exécution de l'application, vous devriez être en mesure de renvoyer datatables du second controller de vue au premier.

Edit: Utilisez la solution de @ Erhan ci-dessus. Pas celui-ci. Ce n'est pas une bonne solution.

CA aidera. Ecrivez ceci dans votre ViewControllerB.

  // Get array of current navigation stack NSArray *arrayViewControllers = [self.navigationController viewControllers]; // Get previous viewController object from it YOUR_VIEW_CONTROLLER_NAME *objViewController = (YOUR_VIEW_CONTROLLER_NAME *)[arrayViewControllers objectAtIndex:arrayViewControllers.count-2]; // For safety this check is needed. whether it the class that you want or not. if ([objViewController isKindOfClass:[YOUR_VIEW_CONTROLLER_NAME class]]) { // Access properties of YOUR_VIEW_CONTROLLER_NAME here objViewController.yourProperty = YOUR_VALUE; } 

Comme Erhan Demirci a répondu, vous pouvez utiliser des delegates. Les delegates sont utiles lorsque vous souhaitez transmettre des données à un seul controller de vue.

NSNotificationCenter est un autre moyen pratique de transférer des données entre viewcontrollers / objects. Ceci est très utile pour diffuser des données dans l'application.

Lire la documentation ici .

Le délégué personnalisé est la meilleure option pour déplacer des données, mais vous pouvez également essayer cela.

Vous pouvez utiliser NSUserDefaults pour déplacer datatables où vous le souhaitez.

Swift 3 Code

 UserDefaults.standard.set(<Value>, forKey: <Key>) // To set data UserDefaults.standard.object(forKey: <Key>) // To get data 

Vous pouvez également utiliser NSNotification pour déplacer des données.

 NotificationCenter.default.post(name: Notification.Name(rawValue: "refresh"), object: myDict) NotificationCenter.default.addObserver(self, selector: #selector(refreshList(_:)), name: NSNotification.Name(rawValue: "refresh"), object: nil) 

Voici comment je le ferais.

 @interface ViewControllerA:UIViewController @property(strong, nonatomic) ViewControllerB * recieverB; @end @implementation ViewControllerA //implement class - (void)prepareForSegue:(UIStoryboardSegue *) sender:(id)sender { segue.destinationViewController.recieverA = self; } -(void)viewDidLoad { //stop strong refrence cycle self.viewControllerB = nil; } @end 

Classe B

 @interface ViewControllerB:UIViewController @property(strong, nonatomic, getter = parentClass) ViewControllerB * recieverA; @end @implementation ViewControllerB //implement class - (void)viewWillDisappear:(BOOL)animated { parentClass.recieverB = self; //now class A will have an instance on class b } @end 

Je n'ai pas mis l'import