我使用以下方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
之前,为了找到我当前的文本字段,我能够写出这样的内容:
if (textField == self.textPlaceID)
{
//Do something
}
有没有办法将textField
的名称作为字符串获取?我并不是要求用户在textField
中输入的内容,我希望能够获取if的属性名称。我需要它然后将其与其他字符串连接起来。我正在进行动态方法调用。
答案 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]);
答案 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]];
}