Frage

Ich mag ein Bild auf einem Bild ändern, aus einem Popup-Dialog von 4-6 Symbolen (stellen Sie sich Ihr Bild auf einer Messenger-Anwendung wie das Ändern). Die Art, wie ich dieses modale Popup implementieren ist durch eine neue Ansicht in IB zu schaffen, mit einer Undurchsichtigkeit auf dem Hintergrund, und dann lade ich dies als ein Subview:

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

Also, wenn der Benutzer ein Symbol berührt, ich habe

- (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];

}

Die Changeicon setzen nur den image auf ein entsprechendes Symbol. Wie Sie sich vorstellen können, dies funktioniert nicht - die Changeicon Nachricht nie funktioniert. Ich kann nicht verstehen, was mache ich falsch, jede Hilfe sehr geschätzt!

War es hilfreich?

Lösung

Sie haben ein paar Möglichkeiten hier ...

Das erste ist eine Eigenschaft auf Ihrem IconsViewController vom Typ ParentViewController* erstellen, zum Beispiel:

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

Um brechen diese weiter nach unten:

  • readwrite denn wir wollen in der Lage sein, den Wert über [self parentController] zugreifen, sondern auch über [iconsViewController setParentController:self] ändern
  • nonatomic, weil ich auch nicht besorgt über Threading
  • assign macht es zu einem „schwachen Verweise“, wo die Eltern nicht von dem Kind zurückgehalten werden. Wenn sie sich retain die andere, um es später zu Speicherlecks führen könnte, weil wenn nicht ausdrücklich freigegeben würden Sie mit einem behalten Kreis am Ende weder Objekt verursacht eine Null Beibehaltungszähler zu treffen.

Wenn Sie von nib laden, legen Sie die Eigenschaft:

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

Dann Anruf, um es von innen iconIsSelected wie folgt aus:

[[self parentController] changeIcon];

Alternativ können Sie einen Delegaten Protokoll erstellen:

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

Und Verwendung dieses Protokoll als eine Eigenschaft, anstelle der Eltern-View-Controller-Typ. Dies ist abstrakter, aber es hält den Design-Reiniger. Die Eltern-View-Controller würde dann implementieren, dass die Delegierten Protokoll, als eine von vielen anderen.

Eine weitere Möglichkeit ist die Verwendung

Andere Tipps

Der Super einer Ansicht ist eine Ansicht, kein View-Controller, aber Sie werfen den Super der Klasse ParentViewController sein. Wenn die Ansicht keine Super hat, gibt sie nil und Nachricht an null sind no-ops (was erklärt, warum man dort nicht abstürzen).

BTW, dass [self release] am Ende ist höchst verdächtig.

scroll top