Я хотел бы узнать, к какому классу может принадлежать NSObject (кроме NSAlert, NSOpenPanel и NSSavePanel), чтобы реагировать на вышеупомянутый вызов (как в заголовке вопроса). Вот сценарий того, что мне нужно сделать. Выбранное меню действие, которое должно быть модальным для . Self.window требует дополнительного ввода пользователем в форме более сложного диалога, чем «ОК/Отмена» (с простотой для рабочего кода, опущенного из примера):beginSheetModalForWindow: completeHandler:
- (IBAction)myActionDialog:(id)sender
{
NSPanel *panel = self.myActionPanel;
[panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
;
if (result == 0){
;
}
}];
}
Однако компилятор предупреждает:
'NSPanel may not respond to beginSheetModalForWindow:completionHandler'
, который на самом деле оказывается, чтобы быть правдой, но я не знаю, как обойти эту проблему и код желаемого поведения. Я искал правильную документацию, но пока ничего не нашел. Любые опытные советы очень приветствуются. Заранее спасибо!
UPDATE:
Этот вопрос уважает:
[[NSApplication sharedApplication] beginSheet: modalForWindow: modalDelegate: didEndSelector:
contextInfo: ]
метод, который работает практически с любым подклассу NSPanel, AFAICT. Единственная проблема заключается в том, что Apple, объявляя ее устаревшей, пока еще не задокументировала метод замещения, который заменил бы ее повсеместно, AFAIK.
См. Ответ здесь, включите ссылку на пример на github http://stackoverflow.com/questions/27541684/adding-slide-down-view-in-nswindow –
Спасибо @boyfarrell, это ценная ссылка и пример также ясно написано, я уже сам это выяснил, для 10.10 SDK. «Более грязная» часть проблемы заключается в обеспечении совместимости, вызывая «Gestalt» (gestaltSystemVersionMinor, & versionMinor); 'in' - (void) applicationDidFinishLaunching: (NSNotification *) aNotification', затем разветвляя код через 'if (versionMinor> .. .) {...} еще {...} '. Кстати, в связи с чем ** version minor ** старый API был удален в _NSPanel (NSWindow) _ вообще? У меня 10,6 - 10,10, за исключением 10,9. Заранее спасибо. – user3078414
Я рекомендую вам не беспокоиться о наличии двух ветвей кода. Дважды код в два раза превышает вероятность ошибок. Это также затрудняет тестирование. Если вы не можете отказаться от поддержки 10.8 и более ранних версий, просто используйте старый API как свой единственный путь к коду. Когда вы отпустите поддержку 10.8 и более ранних версий, переключитесь на новый API и удалите старый API из своего кода. Если вы хотите переключиться, используйте тест, например '[NSWindow instanceRespondToSelector: @selector (beginSheet: completHandler :))' вместо проверки gestalt. Другие лучшие подходы включают сравнение «NSAppKitVersionNumber»; см. заметки о выпуске AppKit. –