Como alterar o UIImage de um UIImageView de uma subview?
-
21-09-2019 - |
Pergunta
Quero alterar uma imagem em uma visualização, a partir de uma caixa de diálogo pop-up de 4-6 ícones (imagine como alterar sua imagem em um aplicativo mensageiro). A maneira como implemento esse pop -up modal é criando uma nova visualização no IB, com opacidade no fundo, e depois carrego isso como uma subview:
IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];
Então, quando o usuário toca um ícone, eu tenho
- (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];
}
O Changeicon apenas define o image
a um ícone correspondente. Como você pode adivinhar, isso não está funcionando - a mensagem do Changeicon nunca funciona. Não consigo entender o que estou fazendo de errado, qualquer ajuda muito apreciada!
Solução
Você tem algumas opções aqui ...
O primeiro é criar uma propriedade no seu iconsviewController do tipo ParentViewController*
, por exemplo:
@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference
Para quebrar isso ainda mais:
readwrite
Porque queremos poder acessar o valor via[self parentController]
mas também mude via[iconsViewController setParentController:self]
nonatomic
Porque não estou muito preocupado em enfiarassign
Para torná -lo uma "referência fraca", onde o pai não será retido pela criança. Se cada umretain
O outro, isso pode levar a vazamentos de memória mais tarde, porque, a menos que seja lançado explicitamente, você acabaria com um círculo de retenção, fazendo com que nenhum objeto acertasse uma contagem de retenção zero.
Quando você carrega da NIB, defina a propriedade:
IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;
Então, chame para isso de dentro de iconIsSelected
assim:
[[self parentController] changeIcon];
Como alternativa, você pode criar um protocolo delegado:
@protocol IconViewSelectedDelegate (NSObject)
- (void) changeIcon;
@end
E use esse protocolo como uma propriedade, em vez do tipo de controlador de visualização pai. Isso é mais abstrato, mas mantém o design mais limpo. O controlador de visualização pai implementaria esse protocolo delegado, como um dos muitos outros.
Outra opção é usar NSNotificationCenter e publique/inscreva -se em eventos da sua visualização dinâmica. Este é o acoplamento "mais frouxo" entre os dois objetos, mas pode ser um exagero para esse cenário.
Outras dicas
A supervisão de uma visualização é uma visualização, não um controlador de visualização, mas você lança a supervisão para ser da aula ParentViewController
. Se a visualização não tiver supervisão, ele retorna nil
, e a mensagem para nil não são ninguém (o que explica por que você não coloca lá).
BTW, isso [self release]
No final, é altamente suspeito.