はじめに
タイトルの通りです。
MacApp開発時に見つけた問題ですがiPadでキーボード接続時にも起きると思います。(未検証)
タグにJavaScript
とあるようにjsを使って解決します。
swift側で解決する方法があれば教えてください。
実行環境
MacOS 13.1
Xcode 14.2
swift 5.7.2
ソースコード
NavigationDelegate.swift
// "WebViewController"は各自命名したclassに合わせて変更してください
extension WebViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
webView.evaluateJavaScript("document.addEventListener('keydown',function(a){var b=a.target.nodeName.toLowerCase();'Backspace'!==a.key||'input'===b&&!'range checkbox radio color submit reset button image file hidden'.split(' ').includes(a.target.type.toLowerCase())||'textarea'===b||a.preventDefault()},!1);")
}
}
解説
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)
を使い遷移開始時にjsを実行します。
jsのコードは圧縮しています、圧縮前のコードはこちらです。
document.addEventListener("keydown", function (e) {
var nodeName = e.target.nodeName.toLowerCase();
var type = e.target.type.toLowerCase();
var typeList = ["range", "checkbox", "radio", "color", "submit", "reset", "button", "image", "file", "hidden"];
if (e.key === "Backspace") {
if (!(nodeName === "input" && !typeList.includes(type) || nodeName === "textarea")) {
e.preventDefault();
}
}
},
false
);
textarea
と一部のinput
ではバックスペースが入力できないと困るのでそれ以外の時に無効化する処理を入れています。
これでテキスト入力時以外はバックスペースを無効化します。