2010-12-16 6 views
3

Ich habe UITextField subclassiert, damit ich einige benutzerdefinierte Verhaltensweisen dafür erstellen kann. Hier sind meine Klassen:Objective C IPhone Subclassing UITextField catch Wert geändert

DataboundTextField.h

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "TestEntities.h" 

@interface DataboundTextField : UITextField <UITextFieldDelegate> { 
NSString *valueMember; 
NSString *displayValueMember; 
ODataObject *boundEntity; 

} 
@property (nonatomic, retain) NSString *valueMember; 
@property (nonatomic, retain) NSString *displayValueMember; 
@property (nonatomic, retain) ODataObject *boundEntity; 
-(void)SetupDataBinding:(ODataObject*)oDataEntity ValueMember:(NSString*)valMemberID DisplayValueMember:(NSString*)disValMember; 

@end 

DataboundTextField.m

#import "DataboundTextField.h" 

@implementation DataboundTextField 

@synthesize valueMember; 
@synthesize displayValueMember; 
@synthesize boundEntity; 

-(id) initWithCoder:(NSCoder *)aDecoder{ 
if ((self = [super initWithCoder:aDecoder])) 
{ 
    self.delegate = self; 
} 

return self; 
} 



-(void)SetupDataBinding:(ODataObject*)oDataEntity ValueMember:(NSString*)valMemberID DisplayValueMember:(NSString*)disValMember{ 

} 

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
return YES; 
} 

@end 

Wie gehe ich über das Überschreiben der Value Ereignis? Ich kann es anscheinend nicht fangen, aber ich versuche es. Alles, was ich tun möchte, ist, eines dieser untergeordneten Textfelder in einer Ansicht zu finden und dieses Ereignis zu erfassen und damit umzugehen.

Bitte helfen.

Vielen Dank im Voraus

+0

Je nachdem, was Sie mit dem UITextField tun müssen, müssen Sie möglicherweise keine Unterklasse erstellen. Mit den UITextFieldDelegate-Methoden kann viel geschehen. –

+0

Ich möchte, dass diese Klasse während des gesamten Projekts wiederverwendbar ist, also denke ich nicht, dass die Verwendung eines Delegaten ausreicht. – IPadHackAndSlash

Antwort

1

für UITextFieldDelegate in der Dokumentation nach, Sie

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

Das Textfeld ruft diese Methode, wenn der Benutzer ein neues Zeichen in das Textfeld verwenden können, oder Löscht ein vorhandenes Zeichen.

Stellen Sie sicher, dass die delegate Eigenschaft Ihres UITextField gesetzt:

- (id)init 
{ 
    if ((self = [super init])) 
    { 
     self.delegate = self; 
    } 
} 
+0

Ich habe das versucht, aber es scheint nicht zu feuern. Ich habe meinen Beitrag bearbeitet, um Ihnen zu zeigen, was ich jetzt habe. – IPadHackAndSlash

+0

Setzen Sie den Delegierten des UITextFields? –

+1

Ich habe jetzt den initwithcoder überschrieben und den Delegaten als sich selbst festgelegt (Code in Post geändert, um zu zeigen, was ich getan habe). Aber jetzt, wenn ich zur Laufzeit in die Textbox klicke, hängt die ganze App ??? – IPadHackAndSlash

-1

Dies ist, was ich verwendet habe, nur bestimmte Zeichen zu ermöglichen, sowie wie viele Zeichen für ein Textfeld erlaubt:

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 
    /* allow only these characters in the textField */ 
    NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890|:[email protected]~_-+#!{}%*"]; 
    for (int i = 0; i < [string length]; i++) { 
     unichar c = [string characterAtIndex:i]; 
     if (![myCharSet characterIsMember:c]) { 
      return NO; 
     } 
    } 
    /* choose how many characters the textField can have */ 
    NSUInteger newLength = [theTextField.text length] + [string length] - range.length; 
    return (newLength > 28) ? NO : YES; 
}