2012-12-10 7 views
0

alertViewShouldEnableFirstOtherButton 메서드에서 사용자 입력의 첫 문자를 대문자로 변경하려고합니다.alertViewShouldEnableFirstOtherButton의 무한 루프 iOS5

- (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; 

} 
: 아이폰 OS 6하지만 내가 무한 루프를 얻을 것 같다에서 iOS 5에서 예상대로 모든는 코드 여기 (I은 경고보기의 텍스트 필드를 설정하면 프로그램이 재귀 적 방법 alertViewShouldEnableFirstOtherButton를 호출) 작동

답변

0

- (BOOL)alertViewShouldEnableFirstOtherButton:은 alertView가 첫 번째 (취소 취소) 버튼을 활성화해야하는지 여부를 대리인에게 요청합니다. alertView는 언제든지이 메서드를 호출 할 수 있습니다 (예 : 텍스트 필드가 변경 될 때 호출 할 수 있음). 대리자로부터 YES/NO 응답을받습니다. 따라서 여기에 부작용을 구현해서는 안됩니다.

[alertView textFieldAtIndex:0].delegate = self과 같은 것을 사용하고 textField 대리자 메서드 중 하나 (예 : – textFieldDidBeginEditing:)를 사용하여 문자열을 수정하는 것이 좋습니다.

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; 
}