1

我正在编写一个带有首选项面板的超酷应用程序。如果用户打开首选项面板,对她的首选项进行更改,然后在不保存这些更改的情况下关闭面板,她将收到 NSAlert 通知,告知她可怕的后果。NSAlert 表有两个按钮,“确定”和“取消”。如果用户按“确定”,则工作表和首选项面板应关闭。如果用户按下“取消”,则工作表应关闭,但不会关闭首选项面板。

这是相关代码的简化版本:

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 打算或建议我实现此功能的方式。感觉就像一个 hack,我没有被明确告知这是这样做的方法。在偶然发现这个解决方案之前,我尝试了很多东西。

我想制作模型 mac 应用程序。是否有一些模式或文件对此进行了更详细的说明?我已经阅读了 Apple 的NSAlert类文档以及他们关于Sheet Programming Topics的文章。

谢谢!

4

1 回答 1

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 文档的任何地方看到的最令人困惑的指南。

于 2011-07-29T08:31:18.673 回答