Есть ли стандартный способ заставить NSAlert условно закрыть окно, к которому он прикреплен?
Я пишу супер классное приложение с панелью настроек. Если пользователь открывает панель настроек, вносит изменения в свои настройки, а затем закрывает панель, не сохраняя эти изменения, он будет приветствован NSAlert, информирующим его о тяжелых последствиях. На листе NSAlert есть две кнопки "ОК" и "Отмена". Если пользователь нажимает "ОК", то лист и панель настроек должны закрыться. Если пользователь нажимает "Отмена", то лист должен закрыться, но не панель prefs.
Вот упрощенная версия рассматриваемого кода:
def windowShouldClose
window_will_close = true
unless self.user_is_aware_of_unsaved_changes
window_will_close = false
alert = make_appropriate_NSAlert # this method returns an NSAlert
alert.beginSheetModalForWindow(self.window,
modalDelegate: self,
didEndSelector: :'userShouldBeAware:returnCode:contextInfo:',
contextInfo: nil)
end
window_will_close
end
def userShouldBeAware(alert, returnCode:returnCode, contextInfo:contextInfo)
if returnCode == NSAlertFirstButtonReturn
self.user_is_aware_of_unsaved_changes = true
end
end
def windowDidEndSheet(notification)
self.window.performClose(self) if self.user_is_aware_of_unsaved_changes
end
Я полагаю, что мое супер-классное приложение выполнило необходимые обязанности, но я обеспокоен тем, что Apple не намерена или рекомендовала бы мне реализовать эту функцию. Это похоже на взлом, и мне нигде не сказали явно, что это способ сделать это. Я попробовал несколько вещей, прежде чем наткнулся на это решение.
Я хотел бы сделать модель Mac приложений. Есть ли какой-нибудь патен или документ, который более подробно описывает это? Я прочитал документацию Apple для класса NSAlert и их статью по темам программирования листов.
Спасибо!
1 ответ
Во-первых, согласно HIG, панели предпочтений не должны запрашивать отмену или подтверждение. Просто автоматически сохраняйте, когда пользователь что-то меняет. Для справки посмотрите, как iTunes обрабатывает свои настройки.
Если вы хотите сохранить диалог, вот что я делаю. Это может пригодиться, когда пользователь закрывает окно приложения и есть что сохранить. Я использую ящик. Это панель, которую я храню в своем файле MainMenu.nib. Затем я делаю его доступным в качестве переменной экземпляра doneWindow, все с помощью InterfaceBuilder и некоторого щелчка. Еще несколько щелчков в InterfaceBuilder регистрируют следующие два метода, которые будут вызываться при соответствующих событиях.
def showSaveDialog
NSApp.beginSheet( doneWindow,
modalForWindow: mainWindow,
modalDelegate: self,
didEndSelector: "didEndSheet:returnCode:contextInfo:".to_sym,
contextInfo: nil)
end
def save(bla)
NSApp.endSheet doneWindow
Pomodoro.new(:text => doneText).save
notifyLabelUpdate
end
def didEndSheet(bla, returnCode: aCode, contextInfo: bla3)
doneWindow.orderOut self
end
Обратите внимание, что руководство на листах, на которые вы указываете, является наиболее запутанным руководством, которое я когда-либо видел в документации Apple.