SwiftUI 搜索栏 - 请帮助我简化我的代码
SwiftUI Search bar - Please help my simplify my code
又是一个新手问题。
我在我的应用程序中实现了搜索功能。但是我对我的代码很不满意。我知道我必须将我的 searchText 放入 .searchable() {...}
但是在不同教程的帮助下,我的知识还不足以做到这一点。
你能不能看看我的代码并给我一个提示,以便我可以从你的解决方案中学习?
//
// FavoriteView.swift
// Blindzeln_Prototyp
//
// Created by Michael Ecke on 25.01.22.
//
import SwiftUI
struct FavoriteView: View {
@EnvironmentObject var blindzeln: BLINDzeln
@State private var searchText = ""
var body: some View {
NavigationView {
List{
ForEach(blindzeln.favorites, id: \.entryID) { item in
if searchText==""{
NavigationLink(destination: FavoriteDetailView(item: item)) {
VStack(alignment: .leading, spacing: 20.0) {
Text(item.title)
.font(.largeTitle)
.foregroundColor(.primary)
Text(item.textBody)
.font(.body)
.foregroundColor(.secondary)
.lineLimit(2)
BigDivider()
}
}.listRowSeparatorTint(.primary)
.listRowSeparator(.hidden)
}
else {
if item.title.localizedCaseInsensitiveContains(searchText) || item.textBody.localizedCaseInsensitiveContains(searchText){
NavigationLink(destination: FavoriteDetailView(item: item)) {
VStack(alignment: .leading, spacing: 20.0) {
Text(item.title)
.font(.largeTitle)
.foregroundColor(.primary)
Text(item.textBody)
.font(.body)
.foregroundColor(.secondary)
.lineLimit(2)
BigDivider()
}
}.listRowSeparatorTint(.primary)
.listRowSeparator(.hidden)
}
}
}
.onDelete(perform: delete)
.onMove(perform: onMove)
}
.searchable(text: $searchText) {}
```
如果没有其余代码进行测试,我无法确定,但您应该能够像这样压缩代码:
struct FavoriteView: View {
@EnvironmentObject var blindzeln: BLINDzeln
@State private var searchText = ""
var body: some View {
NavigationView {
List{
ForEach(blindzeln.favorites.filter { searchText.isEmpty ||([=10=].title.localizedCaseInsensitiveContains(searchText) || [=10=].textBody.localizedCaseInsensitiveContains(searchText)) }, id: \.entryID){ item in
NavigationLink(destination: FavoriteDetailView(item: item)) {
VStack(alignment: .leading, spacing: 20.0) {
Text(item.title)
.font(.largeTitle)
.foregroundColor(.primary)
Text(item.textBody)
.font(.body)
.foregroundColor(.secondary)
.lineLimit(2)
BigDivider()
}
}.listRowSeparatorTint(.primary)
.listRowSeparator(.hidden)
}
}
.onDelete(perform: delete)
.onMove(perform: onMove)
}
.searchable(text: $searchText) {}
// Nothing changed past here...
}
}
基本上我设置的过滤器是这样的:
- 如果
searchText
为空,return TRUE,则使用该项目;
- 如果
searchText
不为空,则计算 OR 的另一侧,即 2 个带 OR 的条件。如果 title
或 textBody
包含 searchText
,return TRUE,则使用项目;
- 如果所有内容 return 都是错误的,请不要使用项目。
最后一件事,将模型结构中的 entryID
重命名为 id
,使模型结构符合 Identifiable
,然后是 ForEach
(省略.filter
可以是这样的:
ForEach(blindzeln.favorites) { item in
作为 Identifiable
结构不需要在 ForEach
初始化器中使用 id:
。
又是一个新手问题。 我在我的应用程序中实现了搜索功能。但是我对我的代码很不满意。我知道我必须将我的 searchText 放入 .searchable() {...} 但是在不同教程的帮助下,我的知识还不足以做到这一点。 你能不能看看我的代码并给我一个提示,以便我可以从你的解决方案中学习?
//
// FavoriteView.swift
// Blindzeln_Prototyp
//
// Created by Michael Ecke on 25.01.22.
//
import SwiftUI
struct FavoriteView: View {
@EnvironmentObject var blindzeln: BLINDzeln
@State private var searchText = ""
var body: some View {
NavigationView {
List{
ForEach(blindzeln.favorites, id: \.entryID) { item in
if searchText==""{
NavigationLink(destination: FavoriteDetailView(item: item)) {
VStack(alignment: .leading, spacing: 20.0) {
Text(item.title)
.font(.largeTitle)
.foregroundColor(.primary)
Text(item.textBody)
.font(.body)
.foregroundColor(.secondary)
.lineLimit(2)
BigDivider()
}
}.listRowSeparatorTint(.primary)
.listRowSeparator(.hidden)
}
else {
if item.title.localizedCaseInsensitiveContains(searchText) || item.textBody.localizedCaseInsensitiveContains(searchText){
NavigationLink(destination: FavoriteDetailView(item: item)) {
VStack(alignment: .leading, spacing: 20.0) {
Text(item.title)
.font(.largeTitle)
.foregroundColor(.primary)
Text(item.textBody)
.font(.body)
.foregroundColor(.secondary)
.lineLimit(2)
BigDivider()
}
}.listRowSeparatorTint(.primary)
.listRowSeparator(.hidden)
}
}
}
.onDelete(perform: delete)
.onMove(perform: onMove)
}
.searchable(text: $searchText) {}
```
如果没有其余代码进行测试,我无法确定,但您应该能够像这样压缩代码:
struct FavoriteView: View {
@EnvironmentObject var blindzeln: BLINDzeln
@State private var searchText = ""
var body: some View {
NavigationView {
List{
ForEach(blindzeln.favorites.filter { searchText.isEmpty ||([=10=].title.localizedCaseInsensitiveContains(searchText) || [=10=].textBody.localizedCaseInsensitiveContains(searchText)) }, id: \.entryID){ item in
NavigationLink(destination: FavoriteDetailView(item: item)) {
VStack(alignment: .leading, spacing: 20.0) {
Text(item.title)
.font(.largeTitle)
.foregroundColor(.primary)
Text(item.textBody)
.font(.body)
.foregroundColor(.secondary)
.lineLimit(2)
BigDivider()
}
}.listRowSeparatorTint(.primary)
.listRowSeparator(.hidden)
}
}
.onDelete(perform: delete)
.onMove(perform: onMove)
}
.searchable(text: $searchText) {}
// Nothing changed past here...
}
}
基本上我设置的过滤器是这样的:
- 如果
searchText
为空,return TRUE,则使用该项目; - 如果
searchText
不为空,则计算 OR 的另一侧,即 2 个带 OR 的条件。如果title
或textBody
包含searchText
,return TRUE,则使用项目; - 如果所有内容 return 都是错误的,请不要使用项目。
最后一件事,将模型结构中的 entryID
重命名为 id
,使模型结构符合 Identifiable
,然后是 ForEach
(省略.filter
可以是这样的:
ForEach(blindzeln.favorites) { item in
作为 Identifiable
结构不需要在 ForEach
初始化器中使用 id:
。