Pergunta

Estou criando um projeto simples para o iPhone, usando o Xcode e Interface Builder. Embora eu entenda que um delegado é, eu tenho um problema com a usá-lo.

Eu tenho um UITextField na minha interface. Ele exibe teclado quando torneiras usuário sobre ele, mas eu preciso programa manualmente Como esconder teclado. Isso pode ser feito usando delegados. Assim, em IB, estou tomando objeto da biblioteca, dando-lhe o nome da classe como Control1Delegate e, em seguida, conectar a saída delegado do meu campo de texto a ser este Control1Delegate. Eu também tenho .m e .h para esta classe Control1Delegate:

Control1Delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1Delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

Mas isso não funciona. Quando executado, ele simplesmente nunca atinge o método textFieldShouldReturn ou deixa de funcionar sem msg ou com EXEC_BAD_ACCESS. O engraçado é que quando eu mover o método no arquivo do controlador (o assistente gerou) e conectar de UITextField a este controlador (dono do arquivo), tudo funciona como esperado. Vi que a maioria coloca tutorial código maçã delegado métodos em objetos aleatórios em vez de classe separada - Eu gostaria de saber por quê. Eu não posso ter delegado na classe separada?

O que eu estou ausente aqui? Alguns ponteiro nulo? LiveCycle objeto?

Foi útil?

Solução

Seu objeto Control1Delegate está sendo destruída logo após sua criação. Todos os top-level Nib objetos devem ser mantidos se você quiser mantê-los vivos. Consulte o Guia do Resource programação: O objeto Nib Ciclo de vida .

O dono do arquivo pode ter uma propriedade como esta, a fim de manter o objeto:

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

Lembre-se de liberar o objeto depois que ele não é mais necessário.

Outras dicas

Você pode colocar métodos de delegado em qualquer classe, incluindo um construído apenas para essa finalidade. A razão Apple (e outros programadores) normalmente não fazem aulas especificamente para funções de delegado é torna-se excessivamente complexa e difícil de compartilhar dados. Por exemplo, em um dos meus projetos que eu poderia fazer uma subclasse janela Controller que alças delegar métodos da janela, a vista de tabela dentro da janela e barra de ferramentas da janela. Tudo que você precisa para manipular e manter o estado de que a janela está em uma classe de controlador. Agora imagine três classes distintas (mais provavelmente uma classe de controlador para gerenciá-los) fazendo o mesmo funções no passado que é um monte de trabalho extra para nenhum benefício real.

Como para por que é deixando de funcionar, parece que você está cometendo um erro com o gerenciamento de memória em outro lugar na sua aplicação. Você pode usar o depurador para rastrear exatamente onde ele está vindo.

Obrigado a ambos. Não só agora eu sei como resolver o meu problema, mas também finalmente entendeu como os objetos são retidos no processo de criação Nib. Não é o suficiente para criar o objeto no IB, se é uma nova entidade, que tem que ser conectado a um ivar real no dono do arquivo (com adequadamente sintetizados getter / setter).

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