WKWebView 内の JavaScript から NSAlert を async await で呼び出す
年末に反省したのに(→ 2018.12.29)またもや青いカテゴリーの記事だ1。とはいえ、いつもみたいに Cocoa ネイティブの話だけではない。
快適に“ひ to り go と”を更新するため自分専用に作っている記事エディタがある。記事やデータベースのファイルはすべてローカルにあるものを編集し、あとから手動でサーバにコピーするから 1 台の Mac 内で完結しているのだけど2、CMS のエンジンにアクセスする都合上エディタも PHP(とクライアント側の小さな JavaScript)で動いている…というのは以前書いた通りだ。
Web ブラウザ内での使用感では飽き足らずそれをラップする Cocoa App まで作ったものの、WKWebView
の中では POST でフォーム上のデータを送信する仕組みのため、記事を保存するたびに画面が真っ白になって再読み込みがかかりエディタやプレビューのスクロール位置がリセットされてしまうものだった。保存せずに記事を離れたりウインドウを閉じるときでも警告すら出てくれない。
macOS 上で macOS らしくない体験はすべてノイズだ。純粋なネイティブ App ではないものの改善の余地はある。ちょうど別件で最近の JavaScript 事情を勉強していたところなので、ES2017 までの新機能をふんだんに使って記事エディタの中身を作り直したのである。
あらゆるものをウインドウの表示範囲の中で無理やり完結しているのが Electron みたいな Web ベースで作られたデスクトップ App の気持ち悪さの一因3だと思う。WKWebView
にさせる仕事がほとんどだとはいえ、せっかく Mac 専用に App を作るのだ。積極的にウインドウの外にもはみ出していこう!
NSAlert
を JavaScript から使う
これだけ長い前置きを書いたもののこの記事で触れるのは NSAlert
だ。これをシートとして表示するだけでずいぶんと Mac App らしくなる。好きなボタンを並べられるし、“保存しない”ボタンを command + delete で押せるようにするようなカスタマイズも簡単だ。「保存しますか?」をネイティブなシートで表示させてみよう。