json - 搜索列表 (JSON) SwiftUI
问题描述
我是 SwiftUI 的新手。我目前正在做 Apple Developer 网站上提供的教程。
我正在查看“处理用户输入”部分,我有一个问题。他们在那里获取 JSON 文件并使用它来填充列表。他们从那里创建“收藏夹”切换。我的问题是,是否有可能使 JSON 列表可搜索?
import SwiftUI
struct LandmarkList: View {
@EnvironmentObject var userData: UserData
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Favorites only")
}
ForEach(landmarkData) { landmark in
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
LandmarkList()
.environmentObject(UserData())
}
}
我找到了一种制作搜索字段的方法,它看起来像这样:
struct SearchBar: UIViewRepresentable {
@Binding var text: String
var placeholder: String
class Coordinator: NSObject, UISearchBarDelegate {
@Binding var text: String
init(text: Binding<String>) {
_text = text
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
}
}
func makeCoordinator() -> SearchBar.Coordinator {
return Coordinator(text: $text)
}
func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
let searchBar = UISearchBar(frame: .zero)
searchBar.delegate = context.coordinator
searchBar.placeholder = placeholder
searchBar.searchBarStyle = .minimal
searchBar.autocapitalizationType = .none
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}
然后调用它,但我找不到搜索列表的方法。我发现很多教程展示了如何搜索数组,但这不是很有帮助。我尝试了几件事,这是其中之一,但它不起作用:
var body: some View {
NavigationView {
VStack {
SearchBar(text: $searchText, placeholder: "Search")
List(LandmarkData.filter{searchText == "" ? true : $0.localizedCaseInsensitiveContains(searchText)}, id: \.self){ landmark in
LandmarkRow(landmark: landmark)
}
}.navigationBarTitle("Landmarks")
}
}
}
有人可以向我解释我做错了什么吗?谢谢
解决方案
我找到了答案:
List {
ForEach(LandmarkData.filter {
$0.name.lowercased().contains(self.searchText) || self.searchText.isEmpty
}, id: \.self) { landmark in
LandmarkRow(landmark: landmark)
}
}
其余的代码保持不变:) 希望它会帮助别人。
推荐阅读
- javascript - 为什么 css 动画不能与切换按钮一起使用?
- java - 遍历动态 JSON 读取每个子节点的属性
- excel - 将 xls 转换为 xlsx 的 Perl 脚本正在生成空白 xlsx 和错误消息
- python - Python 类型提示在方法签名中返回 None - 它有用吗?
- javascript - 使用 @unform 和 react-datepicker 破坏编辑屏幕的 Datepicker 组件
- javascript - 过滤器返回一切但应该只返回一些
- terraform - Terraform 社区提供者是否被视为第三方?
- python - 如何使用python在excel中获取特定列/单元格的水平值
- sql - 如何在 T_SQL 中跨多行连接文本
- vue.js - vuejs中v-for元素中的动态插值计算方法名称