„Im Web suchen“ ist ein neues Feature in iOS 16. Es ermöglicht, in Textfeldern und Text-Views selektierten Text direkt an den Browser weiterzugeben und darüber zu suchen.
Im Zuge eines Projekts kam die Frage auf, wie sich dieses Feature explizit deaktiveren lässt. Es sollte also verhindert werden, dass ein selektierter Text über die genannte Funktion einfach an den Browser weitergegeben werden kann.
Unter UIKit existiert mit UIMenuBuilder
ein Protokoll, über das sich solche Informationen recht flexibel steuern lassen. Dem zugrunde liegt die Methode buildMenu(with:)
der UIResponder
-Klasse. Diese Methode kann man überschreiben und über den als Parameter erhaltenen UIMenuBuilder
festlegen, welche Inhalte beispielsweise das Kontextmenü eines Textfeldes anzeigen soll. Konkret sorgt folgende Extension dafür, dass die Option „Im Web suchen“ (und noch einige andere, die zum Nachschlagen eines selektierten Textes dienen) nicht länger für alle UITextField
-Instanzen innerhalb eines Projekts zur Verfügung steht:
extension UITextField {
open override func buildMenu(with builder: UIMenuBuilder) {
builder.remove(menu: UIMenu.Identifier)
}
}
Das Spannende an dieser Thematik: Genau jener Code blendet die Nachschlagen-Optionen im Kontextmenü eines Textfeldes auch unter SwiftUI aus! Das zeigt sehr deutlich, wie stark diverse View-Elemente in SwiftUI auf passenden Pendants aus UIKit aufbauen. Ist die gezeigte Extension Teil eines SwiftUI-Projekts, greift diese Logik also spannenderweise auf die gleiche Art auch für alle TextField
-Instanzen.
Analog dazu verhält es sich übrigens mit UITextView
und TextEditor
. Der folgende Code deaktiviert die Nachschlagen-Funktionen so auch für diese beiden Elemente:
extension UITextView {
open override func buildMenu(with builder: UIMenuBuilder) {
builder.remove(menu: UIMenu.Identifier)
}
}
So komfortabel und schön diese Lösung auch ist, gilt es, einen wichtigen Aspekt zu beachten: Sollten TextField
und TextEditor
irgendwann nicht länger auf den UIKit-Pendants UITextField
und UITextView
basieren, werden auch die beiden Extensions nicht mehr funktionieren. Für den Moment zeigt diese Lösung aber recht schön, wie nah die beiden Frameworks intern teilweise noch beieinander liegen.
Euer Thomas
Schreibe einen Kommentar