NSAlert でダイアログボックスを作成(macos)

Storyboard + SwiftでmacOSアプリの学習。

NSAlertでダイアログボックスを表示させる。

nsalert.png

1.スタイル

  • アラートをシートとして表示するには、beginSheetModal(for:completionHandler:)
  • モーダルのダイアログとして表示するには、runModal()

2.複数ボタンを表示

ちょっと特殊。まず、位置(NSAlertFirstButtonReturn、など)で識別されるようだ。

こちらはググると結構出てくるのだが、ボタンの役割を位置で識別するのはしっくりこない、、、ググってもなかなか情報がなくてわかりにくかったが、tagメソッドを使って実現できた。

addButton(withTitle:) | Apple Developer Documentation

  • ボタンはアラートの右側から左側に向かって配置されます(左から右へ読む言語の場合)。最初の 3 つのボタンは、モーダルデリゲートによって評価される return-code パラメータで NSAlertFirstButtonReturn、NSAlertSecondButtonReturn、NSAlertThirdButtonReturn として位置的に識別されています。後続のボタンは、NSAlertThirdButtonReturn +n として識別されます(n は整数)
  • デフォルトでは、最初のボタンのキーはReturn、「キャンセル」というタイトルのボタンはEscape、「保存しない」というタイトルのボタンはCommand-Dに相当します(ただし、最初のボタンでない場合のみ)。また、NSButtonクラスのkeyEquivalentメソッドを使えば、ボタンに異なるキー等価を割り当てることができます。
  • NSButtonクラスのtagメソッドを使うと、戻り値を設定することができます。

3.ソース

enum ButtonTag: Int {
	case Ok = 100
	case Cancel = 200
}

@IBAction func convert(_ sender: Any) {
	let alert = NSAlert()

	alert.alertStyle = NSAlert.Style.warning
	alert.messageText = "変換してよろしいですか?"
	alert.informativeText = "ファイルを変換します"
	alert.icon = NSImage(named: NSImage.computerName)
	
        let ok = alert.addButton(withTitle: "Ok")
	ok.image = NSImage(named: NSImage.actionTemplateName)
	ok.imagePosition = NSControl.ImagePosition.imageLeft
	ok.tag = ButtonTag.Ok.rawValue

	let cancel = alert.addButton(withTitle: "Cancel")
	cancel.tag = ButtonTag.Cancel.rawValue

	// alert.runModal()
	alert.beginSheetModal(for: self.view.window!, completionHandler: { response in
	    switch response.rawValue
	    {
	        case ButtonTag.Ok.rawValue:
		    print("OK")
		    break
		case ButtonTag.Cancel.rawValue:
		    print("Cancel")
		    break
		default:
		    print("invalid")
	    }
	})
}

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です