2016-06-20 4 views
0

Ich versuche, die folgende Beispiel-Eigenschaft für ein UITextField-Objekt in Objective C zu deklarieren:Wo deklariere ich eine Instanz-Eigenschaft in Objective C?

@property(nonatomic) BOOL clearsOnInsertion; 

Wo würde ich dies erklären und es richtig in das Textfeld verknüpfen ich in meinem main.storyboard erstellt, so dass es Haben Sie den gewünschten Effekt, den Text zu löschen, wenn der Benutzer mit der Eingabe beginnt?

+0

es in Ihrer .h-Datei deklarieren und dann – Abhi

+0

entsprechend verwende ich auf Ihre Frage denken, basierend Sie versuchen Platzhalter-Text, und deaktivieren Sie es einrichten auf Einfügen dann Textfeld haben eigene Eigenschaft namens Platzhalter, warum Sie es nicht verwenden, anstatt diesen unnötigen Code zu tun –

Antwort

0

A. Allgemein gilt:

Es ist einfach falsch, dass Sie deklarierten Eigenschaften in der H-Datei deklarieren:

a) Sie müssen Eigenschaften der Instanz in einer Schnittstelle deklarieren. Zumindest gibt es drei Arten von Schnittstellen:

  • Die "echte", primäre (Klasse) Schnittstelle mit @interface … : …
  • Eine Klasse Fortsetzung @interface …()
  • Eine Kategorie Schnittstelle @interface …(…)

Worin ist ein Klassenname

b) Es gibt keine Regel, dass eine Schnittstelle in eine .h-Datei platziert werden muss. Keine Regel. In der Regel befinden sich Klassenfortsetzungen in der M-Datei. Dafür sind sie da (siehe B). In der Regel befinden sich Kategorie-Schnittstellen und Klassenschnittstellen in der .h-Datei. Wenn Sie jedoch etwas Kleines privat halten möchten, ist es auch nicht falsch, das Klasseninterface in eine .m-Datei zu stellen.

Für den Compiler ist es ohne Bedeutung, weil es alle enthaltenen Header am Anfang der Kompilation zusammenführt und dann nicht weiß, woher der Quellcode kam. (Um ehrlich zu sein, weiß er es für eine bessere Fehlermeldungen, aber seine Arbeit hängt nicht von ihm.)

B. Weniger allgemeine

Sie haben eine Schnittstelle an einer Stelle zu setzen, jemand, der sollte lesen Sie es, kann lesen Sie es. Da Eigenschaften oft öffentlich zugänglich sind und .h-Dateien öffentlich lesbar sind, liegt es auf der Hand, dass sie in vielen Fällen die richtige Wahl sind. Aber es gibt ein Konzept von privaten Eigenschaften für das Ausblenden und Einkapseln von Informationen.

C. In Ihrem Fall

In früheren Zeiten die IB nur Steckdosen in der H-Datei platziert lesen können. Dies hatte den Nachteil, dass Sie alle Outlets öffentlich machen mussten, auch wenn es eine private Klassenbündel-Kombination gibt und nur der IB Zugang zum Outlet haben sollte.

Ab Version what.ever können Sie es in eine Klassenfortsetzung in der .m-Datei einfügen, um sie privat zu halten. In vielen Fällen ist dies eine gute Wahl.

0

Sie können es sowohl in der .h als auch in der .m Datei deklarieren In.h-Datei können Sie es tun wie dieses

#import <Foundation/Foundation.h> 
@interface ViewController : UIViewController 

@property(nonatomic) BOOL clearsOnInsertion; 
@property(nonatomic,strong) IBOutlet UITextField tfTextField; 
@end 

Zum Ausgang gehe Storyboard öffnen View-Controller-Klasse im Schnittassistenz und drücken Sie Strg und ziehen Sie es an die gewünschte Textfeld

In .m-Datei verbinden Sie können es tun, wie diese

#import "ViewController.h" 

@interface ViewController() 

@property(nonatomic) BOOL clearsOnInsertion; 

@end 

@implementation ViewController 

und für den Effekt, den Text des Löschens, wenn der Benutzer beginnen eingeben Sie die UITextField delegieren in .h oder .m-Datei und verwenden Sie die Delegatmethoden in .m Datei

hinzufügen müssen

.h-Datei

#import <Foundation/Foundation.h> 
@interface ViewController : UIViewController<UITextFieldDelegate> 
@end 

.m-Datei

-(void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    clearsOnInsertion = YES; 
} 

-(void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    clearsOnInsertion = NO; 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    clearsOnInsertion = NO; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if(clearsOnInsertion) 
    { 
    textField.text = @"" 
    clearsOnInsertion = NO; 
    } 
} 
Verwandte Themen