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

- (BOOL)alertViewShouldEnableFirstOtherButton:是让 alertView 询问其代表是否应该启用第一个(非取消)按钮。alertView 可以随时调用此方法(例如,它可能会在其文本字段更改时调用它),以从委托中获得 YES/NO 答案。因此,您不应在此处实现副作用。

我建议使用类似[alertView textFieldAtIndex:0].delegate = self的方法并使用其中一种 textField 委托方法(例如– textFieldDidBeginEditing:)来修改字符串。

于 2012-12-10T17:09:35.127 回答
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 回答