Как выбрать элемент из файла поиска и поместить в текстовое поле в другом файле

Использование SwiftUI — Xcode 14.2 — iOS 16.0

Я пробовал разные руководства по поиску, чтобы создать файл поиска для своего проекта, но не могу понять, как выбрать элемент в файле поиска и поместить этот выбранный элемент в текстовое поле в другом файле. Я искал на этом сайте другие сообщения, я пытался искать через Google, YouTube и т. Д.

В файле 1 у меня есть текстовое поле с подсказкой «начать печатать», и при выборе оно направляет вас в файл поиска, чтобы выбрать нужный элемент, поэтому его можно поместить вместо подсказки.

Файл 1 (где текстовое поле необходимо для вставки выбранного элемента):

      VStack {
     NavigationLink(destination: NameSearch()) {
         TextField("Name", text: .constant(""), prompt: Text("   Start typing  ")
              .foregroundColor(.blue))
              .multilineTextAlignment(.leading)
              .padding()
     }
}

Как только я нажимаю на приглашение «начать печатать», он переходит к файлу NameSearch.swift, как показано ниже.

NameSearch.swift:

      import SwiftUI

struct NameSearch: View {
    
    let name = [
        "Jane", "George", "Sam", "Henry", "Sally", "Liz", "John"
    ]
    
    @State private var searchText = ""
    
    var body: some View {
        
        NavigationStack {
            VStack {
                // Search view
                SearchBarView(searchText: $searchText)
                
                List {
                    // Filtered list of names
                    ForEach(name.filter{$0.hasPrefix(searchText) || searchText == ""}, id:\.self) {
                        searchText in Text(searchText)
                    }
                }
                .navigationBarTitle(Text("Search Name"))
                .resignKeyboardOnDragGesture()
            }
        }
    }
}


struct NameSearch_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            NameSearch()
                .environment(\.colorScheme, .light)
            NameSearch()
                .environment(\.colorScheme, .dark)
        }
    }
}

extension UIApplication {
    func endEditing(_ force: Bool) {
        self.windows
            .filter{$0.isKeyWindow}
            .first?
            .endEditing(force)
    }
}

struct ResignKeyboardOnDragGesture: ViewModifier {
    var gesture = DragGesture().onChanged{_ in
        UIApplication.shared.endEditing(true)
    }
    func body(content: Content) -> some View {
        content.gesture(gesture)
    }
}

extension View {
    func resignKeyboardOnDragGesture() -> some View {
        modifier(ResignKeyboardOnDragGesture())
    }
}


struct SearchBarView: View {
    
    @Binding var searchText: String
    @State private var showCancelButton: Bool = false
    var onCommit: () ->Void = {print("onCommit")}
    
    var body: some View {
        HStack {
            HStack {
                Image(systemName: "magnifyingglass")
                
                // Search text field
                ZStack (alignment: .leading) {
                    if searchText.isEmpty { // Separate text for placeholder to give it the proper color
                        Text("Search")
                    }
                    TextField("", text: $searchText, onEditingChanged: { isEditing in
                        self.showCancelButton = true
                    }, onCommit: onCommit).foregroundColor(.primary)
                }
                // Clear button
                Button(action: {
                    self.searchText = ""
                }) {
                    Image(systemName: "xmark.circle.fill").opacity(searchText == "" ? 0 : 1)
                }
            }
            .padding(EdgeInsets(top: 8, leading: 6, bottom: 8, trailing: 6))
            .foregroundColor(.secondary) // For magnifying glass and placeholder test
            .background(Color(.tertiarySystemFill))
            .cornerRadius(10.0)
            
            if showCancelButton  {
                // Cancel button
                Button("Cancel") {
                    UIApplication.shared.endEditing(true) // this must be placed before the other commands here
                    self.searchText = ""
                    self.showCancelButton = false
                }
                .foregroundColor(Color(.systemBlue))
            }
        }
        .padding(.horizontal)
        .navigationBarHidden(showCancelButton)
    }
}

Вопрос 1: Как скрыть все имена от отображения в списке, чтобы я видел только строку поиска, кнопку отмены и пустой список?

Вопрос 2: Как только я ввожу имя, которое ищу, оно должно всплывать, и я хочу выбрать имя - как я могу это сделать?

  • как только я набираю имя в строке поиска, оно появляется в пустом списке
  • Я выбираю это имя
  • затем он возвращает меня к файлу 1
  • заменяет приглашение «начать печатать» именем, которое я только что выбрал в файле поиска.

Вопрос 3: Я заметил, что в файле поиска появляется предупреждение со следующим кодом. Как я могу решить эту проблему?

      extension UIApplication {
    func endEditing(_ force: Bool) {
        self.windows
            .filter{$0.isKeyWindow}
            .first?
            .endEditing(force)
    }
}

Появляется предупреждение:

«windows» устарели в iOS 15.0: вместо этого используйте UIWindowScene.windows в соответствующей сцене окна.

1 ответ

Во-первых, спасибо за предоставление рабочего примера вашего кода.

Поскольку вы создаете для iOS 15+, вам, вероятно, следует использовать.searchableмодификатор, а не катить свой собственный.

Видео WWDC 2021 года, представляющее эту функцию, находится здесь https://developer.apple.com/wwdc21/10176.

Некоторые новые функции 2022 года здесь: https://developer.apple.com/wwdc22/10052 .

Другие вопросы по тегам