J'utilise MMDrawerController et je souhaite transmettre des données d'un contrôleur de vue à un autre contrôleur de vue en tant que (HomeViewController à DetailViewController)

Contrôleur de vue HomeViewController

Category *categoryItem = [category objectAtIndex:cellIndex];
         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        DetailsViewController * centerVC=(DetailsViewController*)[storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];
                    centerVC.catName= categoryItem.name ;
            centerVC.catUrl=categoryItem.url;
            UINavigationController * centerNav=[[UINavigationController alloc]initWithRootViewController:centerVC];
            AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            appDelegate.drawerController.centerViewController=centerNav;

Et dans ViewDidLoad, nous voulons accéder à la propriété comme Contrôleur de vue DetailsViewController DetailsViewController.h

@property (nonatomic,weak) NSString* catName;
@property (nonatomic,weak) NSString* catUrl;

- (void)viewDidLoad {
    [super viewDidLoad];

self.navigationItem.title = [_catName uppercaseString];

}

Mais un certain temps, _catName a une valeur nulle.

Y a-t-il quelque chose de mal, si alors plz suggèrent.

Si le problème avec la définition des propriétés est faible, quel type de propriété je choisis pour la propriété du contrôleur de vue.

0
saurabh_mishra_08 24 janv. 2017 à 11:36

4 réponses

Meilleure réponse

weak dit "gardez ceci aussi longtemps que quelqu'un d'autre le pointe fortement". Ainsi, votre propriété catName et catUrl ne sera maintenue que jusqu'à ce que categoryItem soit en mémoire.

À la place, vous pouvez utiliser copy.

@property (nonatomic, copy) NSString* catName;
@property (nonatomic, copy) NSString* catUrl;

Une copie garantit que la chaîne que vous avez ne changera pas. Supposons que vous souhaitiez éviter que quelque chose ne passe une chaîne mutable, puis la modifie sans que vous le sachiez.

Par exemple,

NSMutableString *someRandomString = [NSMutableString stringWithString:@"stackoverflow"];

Entrepreneur * entrepreneur = [[Entrepreneur alloc] init];
entrepreneur.name = someRandomString;

[someRandomString setString:@"Steve Jobs"];

Désormais, la valeur de la propriété name de la classe Entrepreneur dépendra du fait que la propriété soit déclarée comme strong ou copy; ce sera @ "Steve Jobs" si la propriété est déclarée comme strong, et @ "stackoverflow" si la propriété est déclarée comme copy.

0
Anoop Nyati 24 janv. 2017 à 08:54

Bien sûr, le problème vient de la faible propriété NSString. Vous devriez avoir des références solides sur NSString catName et NSString catUrl, car ils doivent être en mémoire. Dans votre cas, catName et catUrl disparaissent une fois que la méthode (là où ils avaient été configurés) est terminée.

Mais vous devez définir un paramètre de propriété de copie en raison de NSString (plus d'informations à ce sujet ici https://stackoverflow.com/a/31217735/5151981)

Votre code devrait donc ressembler à ceci:

@property (nonatomic, copy) NSString *catName;
@property (nonatomic, copy) NSString *catURLString;
0
Community 23 mai 2017 à 11:52

Lorsque vous transmettez des données depuis appdelegate, faites de votre propriété une référence solide. et cela vous aidera également.

@property (nonatomic,strong) NSString* catUrl;
@property (nonatomic,strong) NSString* catName;

Différences entre fort et faible en Objective-C

0
Community 23 mai 2017 à 12:08

Veuillez utiliser non atomique et conserver

@property (nonatomic, retain) NSString* catUrl;
@property (nonatomic, retain) NSString* catName;
0
Kcs 24 janv. 2017 à 09:33