0

メソッド alertViewShouldEnableFirstOtherButton で、ユーザー入力の最初の文字を大文字に変更しようとしています。iOS 6 ではすべてが期待どおりに動作しますが、iOS 5 では無限ループが発生するようです (アラート ビューのテキスト フィールドをプログラムで設定すると、メソッド alertViewShouldEnableFirstOtherButton が再帰的に呼び出されます)。コードは次のとおりです。

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView{
    NSString *inputText = [[alertView textFieldAtIndex:0] text];
    if(inputText.length==0)return NO;

    unichar firstChar=[[inputText capitalizedString] characterAtIndex:0];
    NSString *capitalizedLetter= [NSString stringWithCharacters:&firstChar length:1];
    NSString *str=[inputText stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:capitalizedLetter];

   [[alertView textFieldAtIndex:0] setText:str];// setText calls again alertViewShouldEnableFirstOtherButton
    return YES;

}
4

2 に答える 2

0

実際、挿入された文字列の最初の文字を大文字にするshouldChangeCharactersInRange方法を使用しました。UITextField

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSLog(@"range: %@ string: %@", NSStringFromRange(range), string);
    if ([string isEqualToString:@""]) {// detect when the user removes symbol
        if ([textField.text length] > 0)textField.text = [textField.text substringToIndex:[textField.text length] - 1];//remove last character from the textfield 
    }
    if (range.location==0) {//capitalize first letter
        NSString *upperString = [[textField.text stringByAppendingString:string] uppercaseString];
        textField.text = upperString;
    }else {
        textField.text=[textField.text stringByAppendingString:string];
    }
    return NO;
}
于 2012-12-11T10:01:27.943 に答える
0

- (BOOL)alertViewShouldEnableFirstOtherButton:最初の(キャンセル以外の)ボタンを有効にするかどうかをデリゲートに尋ねるalertView用です。alertView は、デリゲートから YES/NO の回答を得るために、いつでもこのメソッドを自由に呼び出すことができます (たとえば、テキスト フィールドが変更されたときに呼び出すことができます)。したがって、ここで副作用を実装しないでください。

のようなもの[alertView textFieldAtIndex:0].delegate = selfを使用し、textField デリゲート メソッドの 1 つ (たとえば– textFieldDidBeginEditing:) を使用して文字列を変更することをお勧めします。

于 2012-12-10T17:09:35.127 に答える