我正在编写一个带有首选项面板的超酷应用程序。如果用户打开首选项面板,更改其首选项,然后关闭面板而不保存这些更改,NSAlert将向她通知她可怕的后果。 NSAlert表有两个按钮,“确定”和“取消”。如果用户按“OK”,则表单和prefs面板应该关闭。如果用户按下“取消”,则表单应该关闭,而不是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应用程序。是否有一些模式或文档更详细地介绍了这个?我已阅读了关于NSAlert课程的Apple文档及其关于Sheet Programming Topics的文章。
谢谢!
答案 0 :(得分:1)
首先,according to the HIG, preference panes should not ask to cancel or confirm.只要用户更改内容,就可以自动保存。有关参考,请参阅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
请注意,guide on sheets that you point to是我在Apple文档中看到的最令人困惑的指南。