2015-12-14 3 views
1

J'ai un viewController avec une propriété de NSInteger (ou NSNumber), ce que je veux faire est de passer l'entier à l'enfant ViewController, faire quelques changements (peut-être ajouter par un certain nombre).iOS modifier Entier/NSNumber de parent ViewController

Mais quand j'utilise NSNumber comme propriété dans le contrôleur mère et de l'enfant et de le transmettre par propriété définie:

//parent and child property.  
@property (nonatomic,strong) NSNumber *num; 

//pass to the child 
child.num = self.num; 

//do some change in child 
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1]; 

Cela ne peut pas changer la valeur de la société mère, parce que NSNumber est en lecture seule et l'enfant qu'ils alloc un nouveau, sans changer la valeur du parent.

Alors:

Comment puis-je passer un NSInteger ou NSNumber à l'enfant ViewController et changer la valeur, et quand l'enfant est absent pop, le contrôleur parent obtenir le changement?

+1

Vous utilisez un modèle de délégué pour cela. – trojanfoe

+0

pouvez-vous me montrer un code du modèle de délégué de faire cela? – FisherMartyn

Répondre

3

Vous définissez et l'attribution d'une nouvelle NSNumber dans la ligne suivante:

self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1]; 

Vous ne pouvez pas utiliser cette méthode, car NSNumbers sont immuables. Ainsi, self.num pointera vers un autre emplacement différent du parent num. Pour éviter des problèmes comme celui-ci, vous pouvez utiliser un modèle délégué ou simplement passer le pointeur viewController du parent à l'enfant et modifier sa valeur num.

Par exemple:

Parent-tête:

@property (nonatomic,strong) NSNumber *num; 

tête de l'enfant:

@property (nonatomic,weak) parentViewControllerClass * parentClass; 

code:

self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1]; 

post-scriptum Vous pouvez vérifier comment définir les protocoles here et here. Avec cela, vous pouvez implémenter le modèle de délégué.

+0

C'est horrible. Plus normal est d'avoir une méthode de délégué comme 'setSomeNumber: (NSUInteger) number;' plutôt que de créer des propriétés externes comme ça. – trojanfoe

+0

@trojanfoe complètement d'accord mais j'ai déclaré qu'il peut utiliser le modèle de délégué avant d'exprimer cet exemple. Je vais ajouter du code pour montrer comment utiliser le délégué. – Amir

+0

Je ne vois rien d'horrible à ce sujet. Ce n'est même pas un délégué; c'est juste une manipulation de propriété simple que l'enfant fait sur le parent. – NRitH

0

Peut-être que dans d'autres langues que vous pourrait pointeur passe à pointeur (je ne sais pas si vous devrait), mais en Objective-C vous ne pouvez pas demander l'adresse de la propriété.

Ce que vous pouvez faire est:

  1. utilisation mentionné modèle de délégué - ce que cela signifie:
    1. Créer protocole qui spécifie la méthode comme setNumber:
    2. Mettre en œuvre ce protocole dans votre contrôleur parent (implémenter simplement la fonction setNumber:)
    3. Définir le contrôleur parent comme la propriété de l'enfant, mais en tant qu'instance de ce protocole, pas instance de sa classe - pour garder l'encapsulation.
    4. Appel setNumber: du contrôleur enfant
  2. Créer mutable objet qui est partagé entre le parent et le contrôleur de l'enfant. Par exemple:

    @interface Counter : NSObject 
    @property (nonatomic) NSInteger value; 
    @end 
    
  3. vous pouvez publier une notification sur le changement de numéro de contrôleur de l'enfant et de l'observer dans parent:

    // post notification in child 
    NSNumber *num = [NSNumber numberWithInteger:1]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"numberChangedNotification" 
        object:self 
        userInfo:@{@"number": num}]; 
    // observe notifications in parent 
    // first register observer in viewDidLoad 
    [[NSNotificationCenter defaultCenter] addObserver:self 
        selector:@selector(changeNumber:) 
        name:@"numberChangedNotification" 
        object:child]; 
    // and implement updateNumber 
    - changeNumber: (NSNotification *)notification { 
        NSNumber *num = notification.userInfo[@"number"]; 
        // ... 
    }