2015-06-19 2 views
1

Есть ли способ заставить NSOpenPanel закрыть, чтобы я мог видеть экран во время отладки? Я не могу видеть код позади этого в Xcode во время отладки, и я тоже не могу переместить панель.NSOpenPanel остается открытым во время отладки

Это то, что у меня есть:

- (IBAction)openImage:(id)sender { 
    NSArray* fileTypes = [[NSArray alloc] initWithObjects:@"jpg", @"JPG", nil]; 

    NSOpenPanel *panel = [NSOpenPanel openPanel]; 
    [panel setCanChooseDirectories:NO]; 
    [panel setCanChooseFiles:YES]; 
    [panel setAllowsMultipleSelection:NO]; 
    [panel setAllowedFileTypes:fileTypes]; 

    [panel beginWithCompletionHandler:^(NSInteger result) { 
     if (result == NSFileHandlingPanelOKButton) { 

      self.image = [[NSImage alloc] initWithContentsOfURL:panel.URL]; 
      [panel close]; 


      [self doSomethingWithImage]; 

     }else{ 
     } 
    }]; 
} 

- (void) doSomethingWithImage { 
    // if I put a breakpoint here, 
    // the NSOpenPanel is still on the screen and I can't move it. 

} 

ответ

0

Простое решение является планирование -doSomethingWithImage на главной очереди так что обработчик завершения завершает (и диалог закрывается) перед -doSomethingWithImage выполняется.

[panel beginWithCompletionHandler:^(NSInteger result) { 
    if (result == NSFileHandlingPanelOKButton) { 

     self.image = [[NSImage alloc] initWithContentsOfURL:panel.URL]; 
     [panel close]; 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

     [self doSomethingWithImage]; 

     }); 

    }else{ 
    } 
}]; 
+0

Я пробовал это, и это не сработало для меня. – Alex311

1

Лично я нашел два подхода:

  1. если вы начинаете ваше приложение, либо переместить приложение или Xcode на другой рабочий стол. Итак, когда вы запустите приложение, он перейдет на другой рабочий стол (где находится Xcode), когда вы достигнете точки останова, и открытая панель не мешает с Xcode.

  2. Использование beginSheetModalForWindow: Кодирование практически не меняется, но панель не скрывает части Xcode во время отладки. OpenPanel запускается как панель выбора, относящаяся к окну. Для beginSheetModalForWindow вы должны указать соответствующее окно (обычно основное окно), которое является единственным дополнительным кодированием.

+0

Я изменил свою панель, чтобы ее отображали в виде листа, и она исправила эту проблему для меня. Благодаря! – Alex311

Смежные вопросы