Cómo cambiar el UIImage de un UIImageView de una vista secundaria?
-
21-09-2019 - |
Pregunta
Quiero cambiar una imagen en una vista, desde un cuadro de diálogo emergente de iconos 4-6 (imaginar como cambiar su imagen en una aplicación de mensajería). A mi modo de poner en práctica este emergente modal es mediante la creación de una nueva vista del IB, con la opacidad en el fondo, y luego cargar esto como una subvista:
IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];
Así, cuando el usuario toca un icono, no tengo
- (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];
}
El changeIcon simplemente establece el image
a un icono correspondiente.
Como se puede adivinar, esto no está funcionando - el mensaje changeIcon nunca funciona.
No puedo entender lo que estoy haciendo mal, cualquier ayuda muy apreciada!
Solución
Usted tiene algunas opciones aquí ...
El primero es crear una propiedad en su IconsViewController de tipo ParentViewController*
, por ejemplo:
@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference
Para descomponerlo aún más:
-
readwrite
porque queremos ser capaces de acceder al valor medio de[self parentController]
sino también cambiarlo vía[iconsViewController setParentController:self]
-
nonatomic
porque no estoy demasiado preocupado por roscado -
assign
para que sea una "referencia débil", donde el padre no será retenido por el niño. Si cada uno de ellosretain
la otra, podría dar lugar a pérdidas de memoria más adelante porque a menos que explícitamente lanzado que iba a terminar con un círculo retener causa ni objeto de golpear un cero conservan recuento.
Cuando se carga a partir de cacao, establezca la propiedad:
IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;
A continuación, la llamada a la misma desde el interior de iconIsSelected
como esto:
[[self parentController] changeIcon];
Como alternativa, puede crear un protocolo de delegado:
@protocol IconViewSelectedDelegate (NSObject)
- (void) changeIcon;
@end
Y el uso que el protocolo como una propiedad, en lugar del tipo de controlador de vista padre. Esto es más abstracto, pero mantiene limpio el diseño. El controlador de vista de los padres sería luego implementar ese protocolo delegado, como uno de muchos otros.
Otra opción es usar NSNotificationCenter y publicación / suscripción a eventos desde su punto de vista dinámico. Este es el "más flojo" el acoplamiento entre los dos objetos, pero podría ser excesiva para este escenario.
Otros consejos
El supervista de una vista es una vista, no un controlador de vista, sin embargo, que tire la supervista a ser de ParentViewController
clase. Si la vista no tiene supervista, devuelve nil
, y el mensaje a cero son no-ops (lo que explica por qué no chocar allí).
BTW, que [self release]
al final es altamente sospechoso.