子类化UITextField

时间:2014-01-02 04:16:00

标签: ios

我想创建一个使用数字键盘的文本字段,只接受数字,即使粘贴也是如此。目前,我有一个标题:

#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

因此它确实没有超出股票的实现功能。它的标题是显而易见的。

编辑:正如一些人所指出的,我不需要对文本字段进行子类化以实现委托功能。我可以把它放在其他地方。但我的问题是:为什么我在这里展示的不起作用?我找不到我的错误。

4 个答案:

答案 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;

}

设置适当的文本字段标记。它也想要过去的其他角色。