2013-05-15 123 views
6

我将此Method添加到我的代码中以格式化文本字段。我使用下面的代码尝试添加方法,但它不工作,我做错了什么?将方法添加到我在单元格中的uitextfield?

.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 ; 
} 

回答

8

您所使用的方法:

-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar 

返回一个NSString对象。在你的情况下,你正在调用方法,但你没有设置返回的NSString对象为任何东西。它只是挂在那里。您需要将phoneFieldTextField设置格式的文本像这样:

phoneFieldTextField.text = [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES]; 

注意 - 如果您想了解更多关于回归方法,然后阅读以下内容:

如果你注意到一些最方法是void类型。当你看到这样的方法时,你会知道这一点:

- (void)someMethod { 
    int x = 10; 
} 

什么是void意味着someMethod不会返回任何东西给你。它只是执行方法内的代码。现在比的方法返回一个对象或其他一些数据类型是这样的:

- (int)returnSomething { 
    int x = 10; 
    return x; 
} 

你会注意到的第一件事就是返回类型不再是无效的,它是一个int。这意味着该方法将返回一个整数类型。在这种情况下,代码执行并返回x的值。

这只是返回方法主题的开始,但希望它能让你的事情变得更清晰一些。

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

还有一堆其他问题在这里:

  • 你需要调用[超级viewDidLoad中]在您的viewDidLoad方法中
  • 您需要正确缩进代码(可能是剪切和粘贴问题)
  • 您应该使用故事板来创建视图。查看更好的解决方案选项卡和BetterTableViewController实现。

必看 - iOS开发视频

+0

首先,我在标题中的问题说明什么是不工作。其次,“bug”不在'textField:shouldChangeCharactersInRange:'中,因为它甚至不是我的方法,下面的Dana能够让它工作得很好。我相应地设置了textField.tag。我还记录了被调用的内容。我的情况3被称为很好,一切正常工作与单元格和占位符罚款。 – Jason

+0

问题在于格式化单元格以使用我在此网站上找到的电话号码方法并正确引用。 'superView didLoad'也在我的'viewDidLoad'中,这个问题就不需要了。正如你所建议的,我也在使用故事板。 – Jason

+1

嗨@Jason你下载并签出我的示例应用程序?确定您的设置标签是否也设置了代表?你是否也可以在上面的问题中包含你的makeTextField代码。谢谢 – GayleDDS

1

看起来你是不是在.h文件中设置委托<UITextFieldDelegate>,而不是将您的文本字段的代理属性分配给自己tf.delegate = self;以便致电- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

试试这个,让我知道它是如何去

- 祝你好运!

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 
    } 
    // (...) 
} 
相关问题