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!

¿Fue útil?

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 ellos retain 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top