0

結果を追加するための簡単なコントロールを備えた血圧アプリを作成しようとしています。簡単にするために、ユーザーが収縮期血圧で 3 文字を入力すると、アプリはカーソル (およびファーストレスポンダ) を拡張期値に移動し、次に脈拍に移動する必要があると判断しました。だから私はこのようにそれを作った:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([self systolicValue].isFirstResponder && [self systolicValue].text.length == 3) {
        [[self diastolicValue] becomeFirstResponder];
    }
    else if ([self diastolicValue].isFirstResponder && [self diastolicValue].text.length == 2) {
        [[self pulseValue] becomeFirstResponder];
    }
    else if ([self pulseValue].isFirstResponder && [self pulseValue].text.length == 2) {
        [[self pulseValue] resignFirstResponder];
    }
    return YES;
}

私はそれが良い解決策だと信じていますが、私が望むようには機能しません。systolicValue の 3 つの数値は、diastolicValue をすぐにファーストレスポンダーにしません。最初のユーザーは別の番号を押す必要があり、次にカーソルが次のテキスト フィールドに移動し、番号がここに移動します。ユーザーは、カーソルが 3 つの数字の後に自動的に移動することを知らないため、少し不便です。

次のテキストフィールドにすぐにフォーカスする方法はありますか? 、および上記の方法と同様の方法も試し[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldTextDidChange:) name:UITextFieldTextDidChangeNotification object:nil];ましたが(ただし、もちろんそうではないため)、どちらも機能しません。実際にはまったく機能せず、最初の数の後、次のようになります。viewDidLoad()returnvoid

2013-08-07 08:39:09.805 MyApp[973:c07] -[AddViewController textFieldTextDidChange:]: unrecognized selector sent to instance 0x7580000
2013-08-07 08:39:09.809 MyApp[973:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AddViewController textFieldTextDidChange:]: unrecognized selector sent to instance 0x7580000'
*** First throw call stack:
(0x1c92012 0x10cfe7e 0x1d1d4bd 0x1c81bbc 0x1c8194e 0xb904f9 0x1cec0c5 0x1c46efa 0xac4bb2 0xad7e6b 0xe5174 0xef5a6 0xb904f9 0x1cec0c5 0x1c46efa 0xac4bb2 0x35689de 0x26b61da 0x2aefdfc 0x2af2bf8 0x3543612 0x354374a 0x3543ec0 0x3543cb8 0x3543204 0x293122b 0x2931193 0x3515e96 0x35424cc 0x2aed136 0x2aec3c6 0x2b1f980 0x317b7fd 0x2b16576 0x2b176da 0x2b1572e 0x3179eaa 0x2b2faf1 0x2b1f72a 0x2af36ae 0x26f262b 0x10e36b0 0x355e810 0x27311a4 0x27332ff 0x1d50b4 0x197aef 0x198e58 0x1979fe 0x1a1d29 0x24ddb 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x24e35 0x24806 0x24beb 0x16698 0x1beddf9 0x1bedad0 0x1c07bf5 0x1c07962 0x1c38bb6 0x1c37f44 0x1c37e1b 0x1bec7e3 0x1bec668 0x13ffc 0x1f2d 0x1e55 0x1)
libc++abi.dylib: terminate called throwing an exception
(lldb) 
4

1 に答える 1

1

このようなことをしてみてください:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string  // return NO to not change text
{

    NSMutableString *finalString = [[NSMutableString alloc] initWithString:textField.text];
    [finalString replaceCharactersInRange:range withString:string];


    if ([self systolicValue].isFirstResponder && [self systolicValue].text.length == 3))
    {
        [[self systolicValue] setText:finalString];
        [[self systolicValue] resignFirstResponder];
        return NO;
    }

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField          // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
{
    [[self diastolicValue] becomeFirstResponder];
}
于 2013-08-07T07:19:03.820 に答える