Есть ли стандартный способ заставить NSAlert условно закрыть окно, к которому он прикреплен? - PullRequest
1 голос
/ 20 июля 2011

Я пишу супер классное приложение с панелью настроек. Если пользователь открывает панель настроек, вносит изменения в свои настройки, а затем закрывает панель, не сохраняя эти изменения, он будет встречен 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 Ответ

1 голос
/ 29 июля 2011

Во-первых, в соответствии с 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.

...