Question

Je souhaite modifier une image sur une vue, d'une boîte de dialogue pop-up de 4-6 icônes (imaginez comme changer votre image sur une application de messagerie). La façon dont je mets en œuvre ce pop-up modal est en créant une nouvelle vue à IB, avec une opacité sur l'arrière-plan, puis-je charger cela comme une sous-vue:

    IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];

Ainsi, lorsque l'utilisateur touche une icône, j'ai

- (IBAction)iconIsSelected:(id)sender {
switch ([sender tag]) {
    case 1:
        [(ParentViewController*)[self superview] changeIcon];
        break;
    case 2:
        // same here..
        break;
    default:
        break;
}
[self.view removeFromSuperview];
[self release];

}

Le ChangeIcon définit juste le image à une icône correspondante. Comme vous pouvez le deviner, cela ne fonctionne pas - le message ChangeIcon ne fonctionne jamais. Je ne comprends pas ce que je fais mal, toute aide appréciée!

Était-ce utile?

La solution

Vous avez quelques choix ici ...

La première est de créer une propriété sur votre IconsViewController de type ParentViewController*, par exemple:

@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference

Pour briser ce niveau plus bas:

  • readwrite parce que nous voulons être en mesure d'accéder à la valeur via [self parentController] mais aussi changer via [iconsViewController setParentController:self]
  • nonatomic parce que je ne suis pas trop inquiet au sujet de filetage
  • assign pour en faire une « référence faible » où le parent ne sera pas retenu par l'enfant. Si chacun d'eux retain l'autre, il pourrait conduire à des fuites de mémoire plus tard, parce que si vous conserver explicitement libéré finiriez avec un cercle causant ni objet de frapper un compte conserver zéro.

Lorsque vous chargez de nib, définissez la propriété:

IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;

Ensuite, appelez à de l'intérieur de iconIsSelected comme ceci:

[[self parentController] changeIcon];

Vous pouvez créer un protocole de délégué:

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

Et utiliser ce protocole comme une propriété, au lieu du type de contrôleur de vue parent. Ceci est plus abstrait, mais il garde le plus propre design. Le contrôleur de vue parent alors de mettre en œuvre ce protocole de délégué, comme l'un des nombreux autres.

Une autre option est d'utiliser

Autres conseils

Le superview d'une vue est une vue, pas un contrôleur de vue, mais vous lancez le superview être de ParentViewController de classe. Si la vue n'a pas superview, il retourne nil, et un message à zéro ne sont pas d'habitation (ce qui explique pourquoi vous n'y tombe pas en panne).

BTW, que [self release] à la fin est fortement suspect.

scroll top