Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
目标C IPhone子类化UITextField捕获值已更改_Iphone_Objective C_Overriding_Subclass - Fatal编程技术网

目标C IPhone子类化UITextField捕获值已更改

目标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

我已经将UITextField子类化,因此可以为它创建一些自定义行为。以下是我的课程:

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
如何覆盖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;
}