Есть ли стандартный способ заставить 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.

Другие вопросы по тегам