SwiftUI搜索页选值填充TextField及相关问题解决(iOS16/Xcode14.2)
问题解决方案
1. 初始隐藏名称,仅显示搜索栏、取消按钮和空列表
在NameSearch视图中,通过判断搜索文本是否为空控制结果列表展示逻辑,初始状态下仅保留搜索栏、取消按钮和空列表占位:
struct NameSearch: View { @State private var searchText = "" @Environment(\.dismiss) private var dismiss @Binding var selectedName: String? // 模拟名称数据源 let allNames = ["Alice", "Bob", "Charlie", "David"] private var filteredNames: [String] { guard !searchText.isEmpty else { return [] } return allNames.filter { $0.localizedCaseInsensitiveContains(searchText) } } var body: some View { NavigationStack { VStack { HStack { TextField("搜索名称", text: $searchText) .textFieldStyle(.roundedBorder) Button("取消") { dismiss() } } .padding() List(filteredNames, id: \.self) { name in Button(name) { selectedName = name dismiss() } } .overlay { if filteredNames.isEmpty && !searchText.isEmpty { Text("无匹配结果") .foregroundColor(.gray) } } } .navigationTitle("搜索名称") .navigationBarTitleDisplayMode(.inline) } } }
2. 输入搜索内容显示匹配结果,选择后返回填充TextField
在File1视图中,通过绑定变量关联TextField文本与搜索页的选中结果,跳转后选择名称自动回填并返回:
struct File1: View { @State private var inputName: String = "" @State private var showSearch = false var body: some View { NavigationStack { VStack { TextField("点击选择名称", text: $inputName) .textFieldStyle(.roundedBorder) .onTapGesture { showSearch = true } NavigationLink(isActive: $showSearch) { NameSearch(selectedName: $inputName) } label: { EmptyView() } } .padding() .navigationTitle("File1") } } }
选择名称后,绑定的inputName会自动更新,同时调用dismiss()返回上一页,完成TextField填充。
3. 解决UIApplication中windows API废弃警告
替换废弃的windows API,通过connectedScenes获取当前活跃的关键窗口:
extension UIApplication { var keyWindow: UIWindow? { return connectedScenes .filter { $0.activationState == .foregroundActive } .first(where: { $0 is UIWindowScene }) .flatMap({ $0 as? UIWindowScene })?.windows .first(where: \.isKeyWindow) } }
之后直接使用UIApplication.shared.keyWindow即可规避废弃警告。
内容的提问来源于stack exchange,提问作者LizG
相关产品推荐
相关产品推荐

