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

#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

我已将文本字段设置为在 Storyboard中使用此类。但是,我想要的功能没有出现。此外,根据调试确定, initWithFrame: 永远不会被调用。有任何想法吗?作为更多上下文,这些文本字段嵌入在表 View Controller 的表 View 的表单元格内。其中,我在这里提供了表格 View Controller 的自定义实现:
@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

因此,除了库存之外,它确实没有实现的功能。它的标题是显而易见的。

编辑:正如有些人指出的那样,我不需要对文本字段进行子类化来实现委托(delegate)功能。我可以把它放在别处。但我的问题是:为什么我在这里介绍的内容不起作用?我找不到我的错误。

最佳答案

您还需要覆盖 DRPNumberTextField 中的 - (id)initWithCoder:(NSCoder *)decoder。如果您在 XIB 或 Storyboard中使用自定义 UITextField,则不会调用 initWithFrame:,而是调用 initWithCoder:

关于ios - 子类化 UITextField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20876250/

10-12 00:49