目标C IPhone子类化UITextField捕获值已更改
我已经将UITextField子类化,因此可以为它创建一些自定义行为。以下是我的课程: DataboundTextField.h目标C IPhone子类化UITextField捕获值已更改,iphone,objective-c,overriding,subclass,Iphone,Objective C,Overriding,Subclass,我已经将UITextField子类化,因此可以为它创建一些自定义行为。以下是我的课程: DataboundTextField.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "TestEntities.h" @interface DataboundTextField : UITextField <UITextFieldDelegate> { NSString *value
#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
如何覆盖ValueChanged事件?不管我怎么努力,我似乎都抓不住它。我所要做的就是在视图中调用这些子类文本字段中的一个,捕获并处理该事件
请帮忙
提前感谢根据
UITextFieldDelegate
的文档,您可以使用
-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
每当用户在文本字段中键入新字符或删除现有字符时,文本字段都会调用此方法
确保设置了UITextField
的delegate
属性:
- (id)init
{
if ((self = [super init]))
{
self.delegate = self;
}
}
这是我用来只允许某些字符的,以及一个文本字段允许多少字符:
- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
/* allow only these characters in the textField */
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890|:.@~_-+#!{}%*"];
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;
}
-(BOOL)文本字段:(UITextField*)文本字段应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串{
/*仅允许在文本字段中使用这些字符*/
NSCharacterSet*myCharSet=[NSCharacterSet characterSetWithCharactersInString:@“ABCDEFGHIJKLMNOPQRSTUVWXYZABDEFGHIJKLMNOPQRSTUVXYZ1234567890:.@~-+#!{}%*”;
对于(int i=0;i<[字符串长度];i++){
unichar c=[string characterAtIndex:i];
如果(![myCharSet成员:c]){
返回否;
}
}
/*选择文本字段可以包含的字符数*/
NSUTEGER newLength=[theTextField.text length]+[string length]-range.length;
返回(新长度>28)?否:是;
}
根据需要对UITextField执行的操作,您可能不需要子类化。UITextFieldDelegate方法可以做很多事情。我希望这个类在整个项目中都可以重用,所以我认为使用一个委托是不够的。我尝试了这个方法,但似乎没有成功。我编辑了我的帖子,向你展示了我现在拥有的东西。你正在设置UITextField的委托吗?我现在覆盖了initwithcoder,并将委托设置为自身(在帖子中更改了代码以显示我所做的事情)。但是现在当我在运行时点击文本框时,整个应用程序都挂起了???不管怎样,“[super-setDelegate:self];”之间有什么区别和“[self-setDelegate:self];”?
- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
/* allow only these characters in the textField */
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890|:.@~_-+#!{}%*"];
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;
}