You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:25:51