我刚刚创建了一个格式化程序类,它将自动格式化输入到 uitextfield 中的数字并返回正确的格式。
IE
文本字段看起来像这样 $0.00
如果您输入 1,2,3,a,b,c,您会在文本字段中获得 1.23 美元。
我通过创建一个 UITextfieldDelegate 自定义类并响应文本字段委托方法来做到这一点。
但是,我的视图控制器还需要在此文本字段中的文本更改时做出响应。
我可以委托代表吗?还是我必须让我的格式化程序类也有一个委托方法?
我刚刚创建了一个格式化程序类,它将自动格式化输入到 uitextfield 中的数字并返回正确的格式。
IE
文本字段看起来像这样 $0.00
如果您输入 1,2,3,a,b,c,您会在文本字段中获得 1.23 美元。
我通过创建一个 UITextfieldDelegate 自定义类并响应文本字段委托方法来做到这一点。
但是,我的视图控制器还需要在此文本字段中的文本更改时做出响应。
我可以委托代表吗?还是我必须让我的格式化程序类也有一个委托方法?
我解决这个问题的方法是创建一个类方法来返回正确格式化的字符串。
然后我将委托保留给 viewController。
当它询问文本字段是否应更改时。我只是使用我的类方法设置文本,然后返回 no,这样它就基本上忽略了用户输入。
我还建议您NSNotificationCenter
在这种情况下使用 a ,因为您不能使用两个代表,这里有一个如何使用NSNotificationCenter
.
不,您不能同时拥有两个代表,这是一个属性,如果您第二次分配它,第一个代表将不再是代表。您可以做的是创建一个通用委托类,在其中设置一个NSNotificationCenter以发送与 UITextField 事件对应的通知,然后将所有类(必须接收这些事件)注册到 NSNotificationCenter。
我意识到我参加这个聚会有点晚了,但为什么不直接在 Interface Builder 中将 CustomDelegate 类添加到您的 VC 中并设置委托UITextField
呢?VC 中不需要额外的代码,也不UITextField
需要子类化。下面的项目链接可以自定义电话号码的格式。
链接到示例项目 当我决定它会消失时,此链接将消失。它可以永远存在(或者只要 Dropbox 还在营业)。
添加了委托类的代码示例(尽管如果有人在 iOS 开发方面有任何经验,则不需要这样做。)该屏幕截图几乎解释了所有答案。为方便起见,添加了示例项目链接。
来自 Delegate 类的代码:
头文件:
#import <Foundation/Foundation.h>
@interface PhoneNumberFormatterDelegate : NSObject <UITextFieldDelegate>
@end
实施文件:
#import "PhoneNumberFormatterDelegate.h"
@implementation PhoneNumberFormatterDelegate
#pragma mark - My Methods
-(void)textFieldDidChange:(UITextField *)textField {
if ([textField.text length] > 11) {
[textField resignFirstResponder];
}
}
#pragma mark - UITextField Delegate Methods
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// If user hit the Done button, resign first responder
if([string isEqualToString:@"\n"]){
[textField resignFirstResponder];
return NO;
}
// All digits entered
if (range.location == 12) {
[textField resignFirstResponder];
return NO;
}
// Reject appending non-digit characters
if (range.length == 0 &&
![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
return NO;
}
// Auto-add hyphen before appending 4rd or 7th digit
if (range.length == 0 &&
(range.location == 3 || range.location == 7)) {
textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
return NO;
}
// Delete hyphen when deleting its trailing digit
if (range.length == 1 &&
(range.location == 4 || range.location == 8)) {
range.location--;
range.length = 2;
textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
[textField removeTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
@end