我怎样才能获得用户所在的当前UITextField的属性名称?

时间:2012-11-01 13:48:41

标签: objective-c ios ipad nsstring uitextfield

我使用以下方法:

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

之前,为了找到我当前的文本字段,我能够写出这样的内容:

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

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

3 个答案:

答案 0 :(得分:4)

UITextField没有“名字”。您可以将文本字段设为tag并使用该字段。

另请注意,(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;

答案 1 :(得分: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]);

source

答案 2 :(得分:0)

主要为每个textField分配唯一标签(例如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]];

}