2013-04-19 3 views
1

В моей программе какао есть функция сохранения, которая, когда пользователь выбрал пункт сохранения, мне нужно будет открыть еще один NSPanel, чтобы отобразить какой-то статус (т. Е. Сколько времени потребуется, чтобы закончить сохранение файла. мой код:не может вызвать startSheet после нажатия OK в NSSavePanel?

- (IBAction)savePressed:(id)sender { 
    __block NSSavePanel *saveDlg = [NSSavePanel savePanel]; 
    // Enable options in the dialog. 
    [saveDlg setCanCreateDirectories:YES]; 
    [saveDlg setAllowedFileTypes:[NSArray arrayWithObject:@"zip"]]; 
    [saveDlg setCanSelectHiddenExtension:YES]; 
    [saveDlg beginSheetModalForWindow:self.window completionHandler:^ (NSInteger result) { 
     if (result == NSOKButton) { 
      [self triggerNSPanel]; 
     } 

     saveDlg = nil; 

    }]; 

} 

- (void) triggerNSPanel { 
    if (!self.myPanel) 
     self.myPanel = [[NSPanel alloc] init]; 
    [NSApp beginSheet:self.myPanel modalForWindow:self.window modalDelegate:nil didEndSelector:nil contextInfo:nil]; 
.... 
} 

так, как только NSSavePanel исчезнет (т. е нормально нажимается), мой NSPanel показывает на как 1/2 второго, то это пошло, я даже не звонил NSApp endSheet

ответ

2

Может быть проблема, которую вы вызываете beginSheet из обработчика завершения. Может быть какая-то очистка после ее вызова, которая убивает ваш второй лист. Попробуйте отправить triggerNSPanel через performSelector: afterDelay (delay может быть 0, поэтому он запускается прямо в следующем раунде цикла).

+0

Да, я изменил свой код на: [self performSelector: @selector (triggerNSPanel) withObject: nil afterDelay: 0]; и теперь он отлично работает, большое вам спасибо за вашу помощь :) – Josh