是否有一种标准的方法让NSAlert有条件地关闭它附加的窗口?

时间:2011-07-20 04:52:41

标签: cocoa macruby

我正在编写一个带有首选项面板的超酷应用程序。如果用户打开首选项面板,更改其首选项,然后关闭面板而不保存这些更改,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的文章。

谢谢!

1 个答案:

答案 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文档中看到的最令人困惑的指南。