Wie die UIImage einer UIImageView von einem Subview ändern?
-
21-09-2019 - |
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!
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 sichretain
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.
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.