我将此Method添加到我的代码中以格式化文本字段。我使用下面的代码尝试添加方法,但它不起作用,我做错了什么?
.h文件
NSString* phone_;
UITextField* phoneFieldTextField;
@property (nonatomic,copy) NSString* phone;
.m文件
@synthesize phone = phone_;
ViewDidLoad{
self.phone = @"";
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
// Make cell unselectable and set font.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13];
if (indexPath.section == 0) {
UITextField* tf = nil;
switch ( indexPath.row ) {
case 3: {
cell.textLabel.text = @"Phone" ;
tf = phoneFieldTextField = [self makeTextField:self.phone placeholder:@"xxx-xxx-xxxx"];
phoneFieldTextField.keyboardType = UIKeyboardTypePhonePad;
[self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES];
[cell addSubview:phoneFieldTextField];
break ;
}
// Textfield dimensions
tf.frame = CGRectMake(120, 12, 170, 30);
// Workaround to dismiss keyboard when Done/Return is tapped
[tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
}
}
// Textfield value changed, store the new value.
- (void)textFieldDidEndEditing:(UITextField *)textField {
//Section 1.
if ( textField == nameFieldTextField ) {
self.name = textField.text ;
} else if ( textField == addressFieldTextField ) {
self.address = textField.text ;
} else if ( textField == emailFieldTextField ) {
self.email = textField.text ;
} else if ( textField == phoneFieldTextField ) {
self.phone = textField.text ;
}else if ( textField == dateOfBirthTextField ) {
self.dateOfBirth = textField.text ;
}
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString* totalString = [NSString stringWithFormat:@"%@%@",textField.text,string];
// if it's the phone number textfield format it.
if(textField.tag == 10 ) {
if (range.length == 1) {
// Delete button was hit.. so tell the method to delete the last char.
textField.text = [self formatPhoneNumber:totalString deleteLastChar:YES];
} else {
textField.text = [self formatPhoneNumber:totalString deleteLastChar:NO ];
}
return false;
}
return YES;
NSLog(@"Testing should change character in range");
}
-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar {
if(simpleNumber.length == 0) return @"";
// use regex to remove non-digits(including spaces) so we are left with just the numbers
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[\\s-\\(\\)]" options:NSRegularExpressionCaseInsensitive error:&error];
simpleNumber = [regex stringByReplacingMatchesInString:simpleNumber options:0 range:NSMakeRange(0, [simpleNumber length]) withTemplate:@""];
// check if the number is to long
if(simpleNumber.length>10) {
// remove last extra chars.
simpleNumber = [simpleNumber substringToIndex:10];
}
if(deleteLastChar) {
// should we delete the last digit?
simpleNumber = [simpleNumber substringToIndex:[simpleNumber length] - 1];
}
// 123 456 7890
// format the number.. if it's less then 7 digits.. then use this regex.
if(simpleNumber.length<7)
simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d+)"
withString:@"($1) $2"
options:NSRegularExpressionSearch
range:NSMakeRange(0, [simpleNumber length])];
else // else do this one..
simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d{3})(\\d+)"
withString:@"($1) $2-$3"
options:NSRegularExpressionSearch
range:NSMakeRange(0, [simpleNumber length])];
if (simpleNumber.length == 10 && deleteLastChar == NO) { [self resignFirstResponder];}
return simpleNumber;
NSLog(@"Testing format phone number");
}
#pragma mark - TextField
-(UITextField*) makeTextField: (NSString*)text
placeholder: (NSString*)placeholder {
UITextField *tf = [[UITextField alloc] init];
tf.placeholder = placeholder;
tf.text = text ;
tf.autocorrectionType = UITextAutocorrectionTypeNo ;
tf.autocapitalizationType = UITextAutocapitalizationTypeNone;
tf.adjustsFontSizeToFitWidth = YES;
tf.returnKeyType = UIReturnKeyDone;
tf.textColor = [UIColor colorWithRed:56.0f/255.0f green:84.0f/255.0f blue:135.0f/255.0f alpha:1.0f];
return tf ;
}
答案 0 :(得分:8)
您正在使用的方法:
-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar
返回NSString对象。在您的情况下,您正在正确调用方法,但您没有将Returned NSString对象设置为任何东西。它只是挂在那里。您需要将phoneFieldTextField设置为格式化文本,如下所示:
phoneFieldTextField.text = [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES];
注意 - 如果您想了解有关退货方法的更多信息,请阅读以下内容:
如果您注意到大多数方法属于 void 类型。当你看到这样的方法时,你知道这一点:
- (void)someMethod {
int x = 10;
}
无效意味着someMethod不会向您返回任何内容。它只是执行方法中的代码。现在返回对象或其他数据类型的方法如下所示:
- (int)returnSomething {
int x = 10;
return x;
}
你会注意到的第一件事是返回类型不再是void,它是一个int。这意味着该方法将返回一个整数类型。在这种情况下,代码会执行,并返回x的值。
这只是返回方法主题的开始,但希望它能使你的事情更加清晰。
答案 1 :(得分:3)
首先,您需要告诉我们 不起作用我们没有您的应用和所有代码。你需要解释什么是有效的,什么是不正常的。需要更长的时间才能弄清楚你的问题是为什么textField:shouldChangeCharactersInRange:
无效。您是否在函数中设置了断点以查看它正在执行的操作。是不是被叫了?
那说你的错误是textField:shouldChangeCharactersInRange:
正在使用标签识别文本字段,但其余代码使用指针
// if it's the phone number textfield format it.
- if(textField.tag == 10 ) {
+ if(textField.tag == phoneFieldTextField ) {
此外,您没有包含makeTextField:placeholder:
的代码也可能存在问题。将您的代码与我的示例中的makeTextField:placeholder:
进行比较。
我在GitHub上创建了一个示例项目。解决这个问题。我还演示了一种使用表视图创建输入表单的更好方法。
https://github.com/GayleDDS/TestTableViewTextField.git
查看两个差异,看看我对YourTableViewController.m
所做的工作是什么。
https://github.com/GayleDDS/TestTableViewTextField/commit/d65a288cb4da7e1e5b05790ea23d72d472564793 https://github.com/GayleDDS/TestTableViewTextField/commit/31ecaec8c9c01204643d72d6c3ca5a4c58982099
这里还有很多其他问题:
必须观看 - iOS开发视频
WWDC 2011 - Session 309 - Interface Builder故事板介绍 https://developer.apple.com/videos/wwdc/2011/?id=309
斯坦福iPhone编程班(2013年冬季)
共同编码:为iPhone和iPad开发应用程序
https://itunes.apple.com/us/course/coding-together-developing/id593208016
答案 2 :(得分:1)
您似乎没有在.h文件中设置委托<UITextFieldDelegate>
,也没有将文本字段的委托属性分配给自tf.delegate = self;
,以便调用- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
试试看,让我知道它是怎么回事
- 祝你好运!
答案 3 :(得分:1)
@koray是对的:您需要为该类设置委托。你的类应声明为实现协议UITextFieldDelegate(除了UITableViewDataSource,我假设)
然后在你的makeTextField:(NSString *)文本占位符:(NSString *)占位符方法中,你需要有类似的东西:
-(UITextField*) makeTextField: (NSString*)text
placeholder: (NSString*)placeholder {
UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(40, 0, 150, 40)];
tf.placeholder = placeholder;
// (...)
tf.delegate = self;
return tf ;
}
然后您需要正确设置委托方法。在下面的示例中,我有一个导航栏,因为数字键盘没有返回或完成按钮。我设置了一个按钮,它将作为完成按钮(您可能有另一种方法使键盘运行,并且在文本字段之间切换将触发编辑结束):
- (void) textFieldDidBeginEditing:(UITextField *)textField {
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneEditing:)];
self.navBar.topItem.rightBarButtonItem = doneBtn;
}
- (void) doneEditing:(id) sender {
if(phoneFieldTextField.isFirstResponder) {
[phoneFieldTextField resignFirstResponder];
}
// (...)
self.navBar.topItem.rightBarButtonItem = nil;
}
然后,魔术发生在textDidEndEditing委托方法中:
- (void)textFieldDidEndEditing:(UITextField *)textField {
if ( textField == phoneFieldTextField ) {
self.phone = [self formatPhoneNumber:textField.text deleteLastChar:YES] ; // convert
[phoneFieldTextField setText:self.phone]; // display
}
// (...)
}