1

設定パネルを備えた超クールなアプリを書いています。ユーザーが設定パネルを開いて設定を変更し、それらの変更を保存せずにパネルを閉じると、悲惨な結果を知らせる NSAlert が表示されます。NSAlert シートには、「OK」と「キャンセル」の 2 つのボタンがあります。ユーザーが「OK」を押すと、シートと設定パネルが閉じます。ユーザーが「キャンセル」を押すと、シートは閉じますが、設定パネルは閉じません。

問題のコードの簡略版は次のとおりです。

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に関する記事を読みました。

ありがとう!

4

1 に答える 1

1

まず第一に、HIG によると、環境設定ペインはキャンセルや確認を求めるべきではありません。ユーザーが何かを変更するたびに自動保存します。参考までに、iTunes が設定を処理する方法を参照してください。

保存ダイアログが必要な場合は、次のようにします。ユーザーがアプリ ウィンドウを閉じて、保存するものがある場合に便利です。引き出しを使用しています。これは、MainMenu .nib ファイルに保存するパネルです。次に、インスタンス変数 doneWindow として使用できるようにします。すべて InterfaceBuilder とクリックを使用します。InterfaceBuilder でさらにクリックすると、適切なイベントで呼び出される次の 2 つのメソッドが登録されます。

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 に答える