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!

Foi útil?

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 enfiar
  • assign Para torná -lo uma "referência fraca", onde o pai não será retido pela criança. Se cada um retain 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top