我想创建一个使用数字键盘的文本字段,只接受数字,即使粘贴也是如此。目前,我有一个标题:
#import <UIKit/UIKit.h>
@interface DRPNumberTextField : UITextField <UITextFieldDelegate>
@end
和实施:
#import "DRPNumberTextField.h"
@implementation DRPNumberTextField
- (id) initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.delegate = self;
[self setKeyboardType:UIKeyboardTypeNumberPad];
}
return self;
}
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
{
return NO;
}
return YES;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
我已将文本字段设置为在故事板中使用此类。但是,我没有想要的功能。而且,由调试确定,initWithFrame:永远不会被调用。有任何想法吗?作为更多上下文,这些文本字段嵌入在表视图控制器的表视图的表格单元格中。其中,我在这里提供了表视图控制器的自定义实现:
@interface DRPImplementSettingsViewController ()
@end
@implementation DRPImplementSettingsViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
因此它确实没有超出股票的实现功能。它的标题是显而易见的。
编辑:正如一些人所指出的,我不需要对文本字段进行子类化以实现委托功能。我可以把它放在其他地方。但我的问题是:为什么我在这里展示的不起作用?我找不到我的错误。
答案 0 :(得分:8)
您还需要覆盖DRPNumberTextField中的- (id)initWithCoder:(NSCoder *)decoder
。如果您在XIB或情节提要中使用自定义UITextField
,则系统不会调用initWithFrame:
,而是调用initWithCoder:
。
答案 1 :(得分:1)
你也可以试试这个,
它也有效
<强> DRPNumberTextField.m 强>
#import "DRPNumberTextField.h"
@implementation DRPNumberTextField
- (void)awakeFromNib
{
[super awakeFromNib];
self.delegate = self;
[self setKeyboardType:UIKeyboardTypeNumberPad];
}
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
{
return NO;
}
return YES;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
答案 2 :(得分:0)
您不需要子类来执行此操作,您只需实现UITextFieldDelegate方法textField:shouldChangeCharactersInRange:replacementString:。每次调用该方法时,检查replacementString是否只包含您想要允许的字符,并根据它是否返回YES或NO。
答案 3 :(得分:0)
这是子类化的替代方法,而不是子类化,您可以使用textfield的委托方法
检查一下,
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
#define NUMBERS @"0123456789"
#define NUMBERSPERIOD @"0123456789-"
NSCharacterSet *cs;
NSString *filtered;
// Period is in use
if (textField.tag==8)
{
cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
return YES;
}
设置适当的文本字段标记。它也想要过去的其他角色。