Domanda

Sto creando un semplice progetto per iPhone, usando Xcode e Interface Builder. Mentre capisco cos'è un delegato, ho un problema con il suo utilizzo.

Ho un UITextField nella mia interfaccia. Visualizza la tastiera quando l'utente lo tocca, ma devo programmare manualmente come nascondere la tastiera. Può essere fatto usando i delegati. Quindi in IB, sto prendendo Object dalla libreria, dandogli il nome della classe come Control1Delegate e quindi collegando l'outlet delegato dal mio campo di testo per essere questo Control1Delegate. Ho anche file .m e .h per questa 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

Ma questo non funziona. Durante l'esecuzione, non raggiunge mai il metodo textFieldShouldReturn o si arresta in modo anomalo senza msg o con EXEC_BAD_ACCESS. La cosa divertente è che quando sposto il metodo nel file del controller (l'unico wizard è stato generato) e mi collego da UITextField a questo controller (File's Owner), tutto funziona come previsto. Ho visto che la maggior parte del tutorial del codice Apple mette i metodi delegati in oggetti casuali piuttosto che in una classe separata - vorrei sapere perché. Non posso avere un delegato in una classe separata?

Cosa mi manca qui? Qualche puntatore nullo? Livecycle dell'oggetto?

È stato utile?

Soluzione

L'oggetto Control1Delegate viene distrutto subito dopo la sua creazione. Tutti gli oggetti pennino di livello superiore devono essere conservati se si desidera mantenerli in vita. Consulta la Guida alla programmazione delle risorse: l'oggetto Nib Ciclo di vita .

Il proprietario del file potrebbe avere una proprietà come questa, al fine di conservare l'oggetto:

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

Ricorda di rilasciare l'oggetto dopo che non è più necessario.

Altri suggerimenti

Puoi inserire metodi delegati in qualsiasi classe, inclusa una creata solo a tale scopo. Il motivo per cui Apple (e altri programmatori) di solito non fanno lezioni appositamente per le funzioni delegate è che diventa eccessivamente complesso e difficile condividere i dati. Ad esempio, in uno dei miei progetti potrei creare una sottoclasse di Window Controller che gestisce i metodi delegati dalla finestra, dalla vista tabella all'interno della finestra e dalla barra degli strumenti della finestra. Tutto il necessario per manipolare e mantenere lo stato di quella finestra è in una classe controller. Ora immagina tre classi separate (più probabilmente una classe controller per gestirle) che svolgono le stesse funzioni: è un sacco di lavoro extra senza alcun vantaggio reale.

Sul motivo per cui si sta arrestando in modo anomalo, sembra che tu stia commettendo un errore con la gestione della memoria da qualche altra parte nella tua applicazione. Puoi utilizzare il debugger per rintracciare esattamente da dove proviene.

Grazie ad entrambi. Non solo ora so come risolvere il mio problema, ma alla fine ho anche capito come gli oggetti vengono conservati nel processo di creazione del pennino. Non è sufficiente creare un oggetto in IB, se si tratta di una nuova entità, deve essere collegato a un vero e proprio ivar nel proprietario del file (con getter / setter correttamente sintetizzato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top