foreach - SwiftUI NavigationLink 灰显
问题描述
在为我的应用程序实现搜索功能后,我希望搜索结果可以点击。因此,我将搜索结果嵌入到导航链接中,但出现了问题。当我尝试搜索对象时,搜索结果显示为灰色,并且导航链接不可点击。
我在 NavigationSearch() 下面的代码中实现了搜索结果
重现此错误:使用 Mark van Wijnen 的NavigationSearch出他的Medium 文章
这节课:
import SwiftUI
struct TracksView2: View {
var tracks: [Track] = tracksData
@State private var searchText: String = ""
var filtered : [Track] {
if searchText.isEmpty {
return tracks
} else {
return tracks.filter({ $0.search(searchText) })
}
}
var body: some View {
NavigationView {
NavigationSearch(text: $searchText, searchResultsContent: {
ForEach(filtered, id: \.id) { track in
NavigationLink(destination: TrackDetailView(tracks: track)) {
TrackRowView(track: track)
}
}
})
} //: NAVIGATION
}
}
(并用 EmptyView 替换 TrackDetailView)
像这样创建一个数据模型:
import SwiftUI
struct Track: Identifiable {
var id = UUID()
var title: String
var headline: String
var image: String
var imagebig: String
var gradientColors: [Color]
var link: String
var description: String
var details: [String]
func search(_ query: String) -> Bool {
let searchable = [title, headline, description] + details
return searchable.filter({ $0.contains(query) }).count > 0
}
}
并使用此示例数据:
import SwiftUI
let tracksData: [Track] = [
Track(
title: "Spa-Francorchamps",
headline: "Die Ardennenachterbahn ist für viele die faszinierenste Rennstrecke überhaupt. ",
image: "road",
imagebig: "preview",
gradientColors: [Color("ColorBlueberryLight"), Color("ColorBlueberryDark")],
link: "https://www.wikipedia.de/",
description: """
Bis
""",
details: ["7004m","8,50-18,50m", "21","100m"]
),
提前致谢 :)
解决方案
这是包装在 UIViewRepresentable 中的 UISearchBar,归功于Tim W Swift UI Contacts。我已经使用它并且它有效。也许试一试?
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.autocapitalizationType = .none // --> here, we make some adjustments to the view so it better fits to our app
searchBar.searchBarStyle = .minimal
searchBar.placeholder = placeholder
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}
推荐阅读
- botframework - 使用 Typscript 创建的虚拟助手 - 在 Bot Framework Emulator 中运行没有响应
- c# - Razor 类库不包含 DLL 中的视图
- java - 弹性搜索 JPA 存储库不提供 findAll 和 findBy... 方法的结果
- nginx - Nginx - 为不同的用户将 cookie 从一个 url 设置到另一个
- mongodb - 如何使用副本集以安静模式运行 mongo shell
- html - 使用 wagtail 图像标签的响应式图像
- html - 如何在html打印的每一页中保持标题高度超过300px.....?
- python - pip3 在 macOS 上崩溃
- sql-server - 具有最小存储大小的 SQL 数据库备份
- selenium - 使用 Scrapy / Selenium 的 Web Scraping 应用程序生成错误:“ModuleNotFoundError 'selenium'”