0

カスタムキーボードが機能するようになりました。アプリに最後の仕上げをしたかったのですが、理解できません。テキスト入力の量を制限したい。私はこの方法を使用しました...

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSLog(@"user is entering numbers");
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 8) ? NO : YES;
}

しかし、それは決して呼び出されません。実際のキーボードで入力でき、テキストは8つに制限されています。ただし、シミュレーターでカスタムキーボードを使用すると、数字を永久に入力できます。カスタムキーボードからこのメソッドを呼び出す方法はありますか?ありがとう!!

編集

Kjulyの助けに応えて。これが私のコードの一部です。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"textFieldDidBeginEditing");
if ([fahrenheit isFirstResponder]) 
{
    self.currentTextField = self.fahrenheit;
    celcius.text = @"";
    kelvin.text = @"";
    self.userIsEnteringANumber = NO;
}
else if ([celcius isFirstResponder])
{
    self.currentTextField = self.celcius;
    fahrenheit.text = @"";
    kelvin.text = @"";
    self.userIsEnteringANumber = NO;
}
else if ([kelvin isFirstResponder])
{
    self.currentTextField = self.kelvin;
    fahrenheit.text = @"";
    celcius.text = @"";
    self.userIsEnteringANumber = NO;
}
}

このメソッドは、編集の開始時に呼び出されます。ただし、shouldChangeChararcterInRangeメソッドは、キーボードを使用した場合にのみ呼び出されます。私のviewDidLoadメソッドは

- (void)viewDidLoad
{
[super viewDidLoad];
[fahrenheit setText:@""];
[celcius setText:@""];
[kelvin setText:@""];
[fahrenheit setInputView:keyPad];
[celcius setInputView:keyPad];
[kelvin setInputView:keyPad];
fahrenheit.delegate = self;
celcius.delegate = self;
kelvin.delegate = self;
}

だから、すべての助けに感謝します、私はこれがすぐに理解されることを望んでいます!

4

2 に答える 2

0

いやー、やっとわかった!!カスタム キーボードを使用している場合、Xcode は shouldChangeCharactersInRange メソッドを実行しないという投稿を見つけました。ボタンに項目が 1 つあるのか複数あるのかを Xcode が認識していないことに関係しています。そのため、そのメソッドは呼び出されませんでした。その後、誰かが作成した別の方法でテキストを制限しようとしているのを見ました。私のカスタムキーボードは、数値を追加するとともに小数点をチェックするため、これはうまくいきませんでした。だから私は次のコードを思いついたし、それは動作します! 私の入力は 8 文字に制限されていますが、別の方法だったのでマイナス記号を使用できます。

- (IBAction)buttonPressed:(UIButton *)sender 
{
NSString *button = [sender currentTitle];
NSRange decimalpoint = [self.currentTextField.text rangeOfString:@"."];
if (self.userIsEnteringANumber)
{
    if (currentTextField.text.length < 8)
    {
       if ([button isEqualToString:@"."] && decimalpoint.location != NSNotFound)
       {
           self.currentTextField.text = self.currentTextField.text;
       }else 
           self.currentTextField.text = [self.currentTextField.text stringByAppendingString:button];
    }else 
        self.currentTextField.text = self.currentTextField.text;
}else 
    {
    self.currentTextField.text = button;
    self.userIsEnteringANumber = YES;
    }
}

みんなの助け、特に@Kjulyに感謝します。

于 2012-08-01T00:04:22.100 に答える
0

しかし、それは決して呼び出されません。

割り当てた後にこれを追加しますyourTextField

[self.yourTextField setDelegate:self];

編集

メソッド-viewDidLoad:は次のようにする必要があります。

- (void)viewDidLoad
{
  [super viewDidLoad];

  // you should alloc your text fields here or in |-init| method
  fahrenheit = [[UITextField alloc] initWithFrame:CGRectMake(...)];
  celcius    = [[UITextField alloc] initWithFrame:CGRectMake(...)];
  kelvin     = [[UITextField alloc] initWithFrame:CGRectMake(...)];
  [self.view addSubview:fahrenheit];
  [self.view addSubview:celcius];
  [self.view addSubview:kelvin];

  [fahrenheit setText:@""]; // you can set it to nil
  [celcius setText:@""];
  [kelvin setText:@""];
  [fahrenheit setInputView:keyPad]; // what's keyPad? It's your custom input view, uh?
  [celcius setInputView:keyPad];
  [kelvin setInputView:keyPad];
  fahrenheit.delegate = self;
  celcius.delegate = self;
  kelvin.delegate = self;
}
于 2012-07-31T01:51:01.630 に答える