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
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) }
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:
Ce qui suit est un exemple basé sur la video (avec quelques modifications).
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