Transmettre les données précédentes viewcontroller
Je suis en train de transmettre des données précédentes viewController.
Personne ne sait comment passer des données à partir de ViewController B pour ViewController Un? Alors je veux un string pour aller "à partir de" BIDAddTypeOfDealViewController à BIDDCCreateViewController. Un utilisateur modifie viewController B et je veux que les données éditées en arrière dans le ViewController Un où je puis l'utiliser.
Je suis en utilisant le passage des données de retour de la section de cette réponse. Comment le mien est différent: le Point 3 et 6 seulement mentionne lorsque les vues sont surgit alors j'ai mis ce code dans viewWillDisappear. Je pense que c'est correct?
Également sur le Point 6, je n'ai pas l'initialiser avec la plume que c'est vieux. J'utilise les storyboards. Et je n'ai pas d'ajouter que la dernière ligne que je ne crois pas que j'aurais de le pousser à. En appuyant sur un bouton sur mon storyboard déjà me prend de l'avant.
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, il devrait aller [méthode d'auto]. Je ne suis pas en mesure de le faire. Eh bien, c'est juste ce que je suis dans le doute.
Il compile et fonctionne très bien seulement, rien n'est enregistré, donc je ne sais pas si cela fonctionne.
Mise à JOUR: je suis incapable de faire la "sendDataToA' méthode à exécuter.
#import <UIKit/UIKit.h>
#import "BIDAddTypeOfDealViewController.h"
@interface BIDDCCreateViewController : UIViewController
@property (strong, nonatomic) NSString *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:(NSString *)myStringData
{
NSLog(@"Inside sendDataToA");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Your string Data Showing" message:myStringData 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:(NSString *)myStringData;
@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:(NSString *)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 devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un délégué. Donc, dans votre ViewController B vous avez besoin de créer un protocole qui envoie des données vers votre ViewController A. Votre ViewController Un serait devenu délégué de ViewController B.
Si vous êtes nouveau à l'objective-C, s'il vous plaît regardez Qu'est-ce que Délégué.
Créer protocole ViewControllerB.h :
ViewControllerB.m
dans votre ViewControllerA : quand vous allez à ViewControllerB
et de définir votre fonction:
Édité :
Vous pouvez Voir un exemple : c'est Comment vous pouvez Transmettre les données précédentes viewcontroller: Tutoriel lien
Un plus court et plus simple méthode de protocole/délégué est de créer une fermeture:
Pour l'envoi d'une Chaîne de retour dans mon cas.
Dans ViewControllerA:
Dans ViewControllerB:
"self"
directement. Vous devez créer d'abord une faible auto / propriétaire de l'auto, puis de le convertir à une forte auto avant de l'utiliser à l'intérieur de la fermeture.Swift: Envoi de données à l'aide du modèle de délégué
Ma réponse complète qui couvre la transmission des données à la fois des moyens est ici. Ma réponse expliquant le modèle de délégué est ici.
Pour transmettre des données en arrière à partir de la seconde vue-contrôleur à la première vue-contrôleur, vous utilisez un protocole et d'un délégué. Cette vidéo est très claire marche bien de ce processus:
Ce qui suit est un exemple basé sur la vidéo (avec quelques modifications).
Créer le storyboard de la mise en page dans l'Interface Builder. De nouveau, pour faire la transition, vous avez juste Contrôle faites glisser le bouton vers le Second point de Vue du Contrôleur. Définir la séquence de l'identificateur de
showSecondViewController
. Aussi, ne pas oublier de brancher les prises et les actions à l'aide des noms dans le code suivant.Première Vue-Contrôleur
Le code pour la Première-Vue-Contrôleur est
Notez l'utilisation de notre coutume
DataEnteredDelegate
protocole.Second point de Vue du Contrôleur et du Protocole de
Le code pour le second point de vue contrôleur est
Noter que le
protocol
est en dehors de l'Affichage de Contrôleur de classe.Que c'est. L'exécution de l'application maintenant, vous devriez être en mesure de transmettre des données à partir de la seconde vue-contrôleur à la première.
Edit:
Utiliser @Erhan la solution ci-dessus. Pas celui-ci. Ce n'est pas une bonne solution.
Cela aidera. Écrire ceci dans votre ViewControllerB.
Comme Erhan Demirci répondu, vous pouvez utiliser les délégués. Les délégués sont utiles lorsque vous souhaitez transmettre des données à une seule vue-contrôleur.
NSNotificationCenter
est un autre moyen pratique pour transférer des données entre viewcontrollers/objets. Ceci est très utile dans de radiodiffusion de données au sein de l'application.de lire la documentation ici.
Délégué personnalisé est la meilleure option pour déplacer les données, mais vous pouvez l'essayer aussi.
Vous pouvez utiliser NSUserDefaults pour Déplacer les données de n'importe où vous voulez.
Swift 3 Code
Vous pouvez également utiliser NSNotification pour déplacer des données.
Il y a protocole de fermeture. Avec fermeture, nous devons éviter les fuites de mémoire en utilisant la faiblesse de l'autonomie (ou le propriétaire de l'auto). Avec le protocole, il y aurait un par viewController que vous voulez "moniteur", jusqu'à la fin avec des dizaines de délégué à mettre en œuvre. Ici, j'ai une autre solution simple rapide:
À l'intérieur d'un fichier nouveau ou existant (par exemple:
UIViewController+Extensions.swift
), pour créer ce protocole:À l'intérieur de NIVEAU 2 viewController, où vous souhaitez un rappel automatique lorsque le Retour est pressée à partir de:
Depuis
delegate
est facultatif, vous pouvez ajouter ce code dans une classe de base de votre point de vue contrôleurs. Je voudrais ajouter à l'endroit où il doit être.Dans votre NIVEAU 1 viewController, supposons que vous appeler de NIVEAU 2 par l'intermédiaire d'un segue dans Storyboard:
prepare(for:sender:)
Ici est de savoir comment j'allais le faire.
Classe B
Je n'ai pas mis le #import
ViewControllerB
retour àViewControllerA
. Pas même quelque chose de la question de l'OP.