2012-10-03 3 views
2

내 응용 프로그램에서 사용자가 도구 모음의 저장 버튼을 클릭하면 사용자는 UIAlertView를 통해 현재 작업을 저장하는 방식을 묻습니다 이미지로 저장하거나 재생으로 저장합니다. 사용자가 재생으로 저장을 선택하면 두 번째 UIAlertView가 프롬프트되어 재생을위한 이름을 삽입 할 수있는 텍스트 필드도 있습니다. 달성하려고하는 것은 텍스트가 입력되지 않았을 때 Ok 버튼이 비활성화되고 입력 된 텍스트의 길이가 1 이상이면 파일을 저장할 수 있습니다 (아카이버를 사용하면 올바르게 작동합니다. 이것은 isue가 아닙니다) Ok 버튼이 활성화됩니다. 다음은 두 개의 경고보기뿐만 아니라보기의 다른 항목을 선택할 때 발생하는 내용을 보여주는 코드입니다. 텍스트가 입력 될 때 UIAlertView에서 버튼을 활성화합니다 - 여러 경고보기

- (IBAction)selectSaveType { 
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"" 
                message:@"Please Select an Option." 
               delegate:self 
             cancelButtonTitle:@"Save Play" 
             otherButtonTitles:@"Save to Photos", nil]; 
[message show]; 

} 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 
if([title isEqualToString:@"Save Play"]) 
{ 
    NSLog(@"Save Play was selected."); 
    [self GetFileName]; 
} 
else if([title isEqualToString:@"Save to Photos"]) 
{ 
    NSLog(@"Save To Photos was selected."); 
    //here is where we need to find how to call saveDrawing. 
    [self saveDrawing]; 

} 
else if([title isEqualToString:@"Ok"]) 
{ 
    NSLog(@"OK selected"); 
    UITextField *fName= [alertView textFieldAtIndex:0]; 
    NSString *NameFile = fName.text; 
    [self savePlay:NameFile]; 


} 

} 

-(void)savePlay:(NSMutableString *)fileName{ 
//code here to save via archive. 
    NSArray *pathforsave = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [pathforsave objectAtIndex:0]; 
    //here we need to add the file extension onto the file name before we add the name to the path 
    [fileName appendString:@".hmat"]; 
    NSString *strFile = [documentDirectory stringByAppendingPathComponent:fileName]; 
[NSKeyedArchiver archiveRootObject:matView.drawables toFile:strFile]; 

} 

내가이 문제를 처리하기 위해 아래에 다음 코드를 사용하려고하지만되었을 때합니다 (이 연극을 선택 요구하고 - 아니 텍스트 필드 현재) - 첫번째 UIAlertView 화재 후 아래의 기능이 실행되고, 첫 번째 경고보기에 텍스트 필드가 없기 때문에 응용 프로그램이 충돌합니다.

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView 
{ 
NSString *inputText = [[alertView textFieldAtIndex:0] text]; 
if([inputText length] >= 1) 
{ 
    return YES; 
} 
else 
{ 
    return NO; 
} 
} 

은 alertViewShouldEnableFirstOtherButton이 명중 할 때 첫 번째 경고 화재, 다음, 시뮬레이터 내 응용 프로그램이 충돌합니다. 왜 이런 일이 일어날 지 누가 알겠습니까? 두 가지 사항이 확실하지 않습니다

하나 - 왜 두 번째 경고보기의 Ok 버튼 핸들이 다른 버튼이 처리되는 동일한 블록에서 처리되는지 설명합니다. 별도의 경고보기가 있기 때문에 자체 블록에 있어서는 안됩니까?

두 가지 - alertViewShouldEnableFirstOtherButton이 두 번째 경고보기에 아직 도착하지 않은 이유는 두 가지입니다. 첫 번째 경고보기에서 호출되어 실행되고 앱이 충돌합니다. 당신의 도움에 대한

덕분에, 나는 당신이 존재하는 경고보기 위해 호출됩니다 경고보기위한 목적 C.

답변

10

위임 방법에 새로운입니다. 평범한 경고보기에서는 textFieldAtIndex:0이 존재하지 않기 때문에이 코드가 충돌합니다. 이 문제를 해결하려면 액션을 호출 한 경고를 식별하는 대리자 메서드에 if 문을 추가해야합니다.

편집 : 더 이상 경고를 이름별로 구분하지 않습니다. 이제 코드가 대리인 보낸 사람의 스타일을 확인합니다.

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView 
{ 
    if (alertView.alertViewStyle == UIAlertViewStylePlainTextInput) { 
     if([[[alertView textFieldAtIndex:0] text] length] >= 1) 
     { 
      return YES; 
     } 
     else 
     { 
      return NO; 
     } 
    }else{ 
     return YES; 
    } 
} 
+1

아. 나는 이것을 시험해보고 그것이 어떻게 효과가 있었는지 알려줄 것이다. 감사! – njj56

+0

myTextAlertView -이게 뭐야? 내가 처리하려고하는 내 경고보기는 alertView라는 이름입니다.이 경고를 대체 할 때 alertView는 항상 alertView가 될 것입니다. alertView의 이름을 바꾸려고 시도했으나 작동하지 않습니다. - 내가 편집을 시도하기 전에 편집을 보지 못했습니다. – njj56

+0

이 작품, 고마워요! – njj56

관련 문제