概览
有些情况下,我们需要为文本编辑器实现文本的查找和替换功能(find & replace),如果完全靠自已撸码还是比较棘手的。
所幸的是,从 SwiftUI 4.0 (iOS 16)开始,Apple 已经将查找与替换功能原生嵌入到 TextEditor 中了:
只需几行代码,我们即能恣意任性实现文本查找和替换功能的开启与关闭,以及其它定制细节。
在本篇博文中,就让我们一起来看看如何轻松实现它吧!
Let‘s go!!!😉
开启和关闭
从 SwiftUI 4.0 开始,TextEditor 已经可以原生支持查找和替换功能了。
struct ContentView: View {
@State private var bio = "Describe someone, Thanks./n contained no UIScene configuration dictionary (looking for configuration named BEST!"
@State private var isShowingFindNavigator = false
var body: some View {
NavigationStack {
TextEditor(text: $bio)
.font(.title)
.padding()
.navigationTitle("查找与替换DEMO")
}
}
}
如果设备已连接物理键盘,我们可以使用键盘快捷键 Cmd+F 开启查找界面,用 Option+Cmd+F 来开启替换界面:
我们还可以在 TextEditor 上调用 findNavigator() 修改器方法来手动启用和关闭查找和替换界面:
struct ContentView: View {
@State private var bio = "Describe someone, Thanks./n contained no UIScene configuration dictionary (looking for configuration named BEST!"
@State private var isShowingFindNavigator = false
var body: some View {
NavigationStack {
TextEditor(text: $bio)
.font(.title)
.findNavigator(isPresented: $isShowingFindNavigator)
.toolbar {
Button("打开查找与替换") {
isShowingFindNavigator.toggle()
}
}
.padding()
.navigationTitle("查找与替换DEMO")
}
}
}
默认情况下,findNavigator() 首先弹出查找界面,我们可以点击其中的放大镜小图标来继续显示替换界面:
需要注意的是:在 Xcode 14.2 预览中无法通过此种方法来显示替换界面,必须在模拟器或真机中才可以。
自定义条件
有些情况下,我们可能不希望 TextEditor 响应查找或替换功能。
这可以通过在 TextEditor 上调用 replaceDisabled() 或 findDisabled() 修改器来实现:
struct ContentView: View {
@State private var bio = "Describe someone, Thanks./n contained no UIScene configuration dictionary (looking for configuration named BEST!"
@State private var isShowingFindNavigator = false
var body: some View {
NavigationStack {
TextEditor(text: $bio)
.font(.title)
// 不开启文本替换功能
.replaceDisabled(true)
.findNavigator(isPresented: $isShowingFindNavigator)
.toolbar {
Button("打开查找与替换") {
isShowingFindNavigator.toggle()
}
}
.padding()
.navigationTitle("查找与替换DEMO")
}
}
}
如上代码所示,我们为 TextEditor 关闭了文本替换功能(依然支持查找)。
再次运行 App,现在已无法显示替换界面了:
总结
在本篇博文中,我们通过 SwiftUI 4.0(iOS 16+)原生提供的支持,仅用几行代码就实现了文本的查找与替换功能,棒棒哒!
-
更多关于 TextField 视图相关的操作,请猛戳 SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为 链接观赏。
-
更多关于 SwiftUI 知识的精彩博文,请移步 开发疑难秒懂百科
专栏欣赏。
感谢观赏,再会!😉