Frage

Ich bin ein einfaches Projekt für das iPhone erstellen, mit Xcode und Interface Builder. Während ich verstehe, was ein Delegierter ist, habe ich ein Problem mit ihm mit.

Ich habe eine UITextField in meiner Schnittstelle. Es zeigt Tastatur, wenn der Benutzer darauf tippt, aber ich muss manuell programmieren, wie Tastatur auszublenden. Es kann mit Delegierten erfolgen. Also in IB, ich bin Objekt aus der Bibliothek nehmen, gibt es Klassennamen als Control1Delegate und dann Verbinden der Delegierten Austritt aus meinem Textfeld dieses Control1Delegate zu sein. Ich habe auch .m und .h-Dateien für diese Control1Delegate Klasse:

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

Aber das funktioniert nicht. Beim Laufen, es reicht einfach nie die textFieldShouldReturn Methode oder Abstürze ohne msg oder mit EXEC_BAD_ACCESS. Das Komische ist, dass, wenn ich die Methode in der Controller-Datei verschieben (der Assistent generierte) und eine Verbindung von UITextField zu diesem Controller (File Besitzer), funktioniert alles wie erwartet. Ich sah, dass die meisten Apple-Code Tutorial delegierten Methoden in zufällig ausgewählten Objekten setzt eher dann separate Klasse - Ich möchte wissen, warum. Kann ich nicht delegieren in separate Klasse haben?

Was ich hier fehlt? Einige Null-Zeiger? Objekt livecycle?

War es hilfreich?

Lösung

Ihr Control1Delegate Objekt wird immer bald zerstört, nachdem sie erstellt wird. Alle Top-Level-Nib Objekte müssen beibehalten werden, wenn man sie am Leben halten wollen. Wenden Sie sich an den Ressourcen Programming Guide: Der Nib Object Life Cycle .

Die Besitzer der Datei könnte eine Eigenschaft wie diese haben, um das Objekt zu erhalten:

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

Denken Sie daran, das Objekt freizugeben, nachdem es nicht mehr benötigt wird.

Andere Tipps

Sie können Delegatmethoden in jeder Klasse setzen, darunter eine eingebaute nur für diesen Zweck. Der Grund von Apple (und anderen Programmierern) in der Regel nicht Klassen macht speziell für Funktionen delegieren ist es zu komplex und schwierig wird, Daten zu teilen. Zum Beispiel in einem meiner Projekte könnte ich einen Window-Controller Unterklasse machen, die Delegatmethoden aus dem Fenstergriffe, innerhalb des Fensters der Tabellenansicht und die Symbolleiste des Fensters. Alles, was Sie brauchen, um den Zustand des Fensters ist in einer Controller-Klasse zu manipulieren und zu pflegen. Stellen Sie sich nun drei separate Klassen (plus wahrscheinlich eine Controller-Klasse, um sie zu verwalten), um die gleiche functions-- zu tun, dass für keinen wirklichen Nutzen vieler zusätzlichen Arbeit ist.

Wie, warum es abstürzt, es klingt wie Sie einen Fehler bei der Speicherverwaltung woanders in Ihrer Anwendung zu machen. Sie können den Debugger verwenden, um genau auf die Spur, wo es herkommt.

Danke euch beiden. Nicht nur ich weiß jetzt, wie mein Problem zu lösen, sondern auch endlich verstanden, wie Objekte in Nib Erstellungsprozess zurückgehalten werden. Es ist nicht genug Objekt in IB zu schaffen, wenn es sich um eine neue Einheit ist, hat es zu einem echten Ivar in Datei-Besitzer (mit richtig synthetised Getter / Setter) verbunden werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top