Posted at

[SwiftUI]ビューのデフォルトの挙動を変更する

例えば、UITableViewはkeyboardDismissModeというオプションがありこれを指定することでスクロールするとキーボードを隠すことができるようになったりします。

しかし、SwiftUIではkeyboardDismissModeのようなOSに依存したパラメータはほとんど無いため設定することが出来ません。

UIViewRepresentableなどでUIKitをラップして使えるようにするなど工夫の余地はありますが、SwiftUIの利点を失う事とトレードオフであることもあります。

そこで、SwiftUIもiOS13の世界ではUIKitをビューとして利用している点を利用してMethodSwizzleでデフォルトの挙動を差し替えてみましょう。

extension UITableView {

static var nfs_DefaultKeyboardDismissMode: KeyboardDismissMode = .none

static func setDefault(_ mode: KeyboardDismissMode) {
nfs_DefaultKeyboardDismissMode = mode
let from = class_getInstanceMethod(UITableView.self, #selector(getter: UITableView.keyboardDismissMode))!
let to = class_getInstanceMethod(UITableView.self, #selector(getter: UITableView.nfs_keyboardDismissMode))!
method_exchangeImplementations(from, to)
}

@objc var nfs_keyboardDismissMode: KeyboardDismissMode {
UITableView.nfs_DefaultKeyboardDismissMode
}
}

これをAppDelegateなどのUIKitをimportしているところで

UITableView.setDefault(.interactive)

といった具合に呼べばアプリ全体のUITableViewの挙動が変わるはずです。

個別に指定できませんが、全体で変わっても良さそうなものならこのような手を使ってUXを変えることもできます。