1

我正在使用以下方法:

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

之前,为了找到我所在的当前文本字段,我可以这样写:

if (textField == self.textPlaceID)
{
    //Do something
}

有没有办法将 my 的名称textField作为字符串获取?我不是要求获取用户输入的内容textField,我希望能够获取 if 的属性名称。我需要它然后将它与其他一些字符串连接起来。我正在做一个动态方法调用。

4

3 回答 3

4

UITextFields 没有“名称”。您可以给您的文本字段 atag并使用它。

另外,请注意,仅当您引用相同的对象(pointer == pointer)时才会返回 true ,而不是等效值。

以下是如何使用标签:在 Interface Builder 中,给每个文本字段一个标签,或者如果您以编程方式创建文本字段,请设置textField.tag = someInt;我通常使用宏来使代码更具可读性:

#define kNameTextField 2
#define kAddressTextField 3

...

if (textField.tag == kNameTextField) ...

有很多这样的字段,我更喜欢枚举:

typedef enum {
  kNameTextField = 2, 
  kAddressTextField, 
  kPhoneTextField // etc
} Fields;
于 2012-11-01T14:03:12.573 回答
1

您可以使用以下代码获取属性名称(在您的情况下为 textField 属性):

-(NSString *)propertyName:(id)property {  
    unsigned int numIvars = 0;
    NSString *key=nil;
    Ivar * ivars = class_copyIvarList([self class], &numIvars);
    for(int i = 0; i < numIvars; i++) {
    Ivar thisIvar = ivars[i];
    if ((object_getIvar(self, thisIvar) == property)) {
        key = [NSString stringWithUTF8String:ivar_getName(thisIvar)];
        break;
    }
} 
    free(ivars);
    return key;
} 

记得导入:

#import <objc/runtime.h>

只需致电:

NSLog(@"name = %@", [self propertyName:self.textField]);

资源

于 2012-11-01T14:23:05.397 回答
0

主要为每个 textFields 分配唯一标签(例如 1,2,3 .....)避免 textField 标签为 0

-(void)viewDidLoad{
NSDictionary *dictionary ; //declare it in .h interface

dictionary =  [NSDictionary dictionaryWithObjectsAndKeys:@"textPlaceID",[NSNumber numberWithInt:1], @"textPlaceID2",[NSNumber numberWithInt:2],nil]; // add textField as object and tag as keys
}

更远..

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

NSString *textFieldPropertyName = [dictionary objectForKey:[NSNumber numberWithInt:textField.tag]];

}
于 2012-11-01T14:04:21.680 回答