В Swift UI необходимо сохранить как NavigationLink для подробного просмотра, так и распознаватель жестов Tap - PullRequest
0 голосов
/ 22 апреля 2020

Я пробую простое приложение, представляющее собой список с элементами, которые ведут к подробному просмотру. У меня также есть панель поиска, которая открывает клавиатуру, и мне нужно скрыть клавиатуру, когда пользователь нажимает где-нибудь за пределами клавиатуры.

@State private var keyboardOpen: Bool = false

var body: some View {

    NavigationView {
        Form {
            Section {

                TextField("Search", text: $cityStore.searchTerm, onCommit: debouncedFetch)
                    .keyboardType(.namePhonePad)
                    .disableAutocorrection(true)        
                    .onTapGesture { self.keyboardOpen = true }
                    .onDisappear { self.keyboardOpen = false }
            }

            Section {
                List {
                    ForEach(cities) { city in
                        NavigationLink(
                        destination: DetailView(city: city)) {
                            VStack(alignment: .leading) {
                                Text("\(city.name)")
                            }
                        }
                    }
                }
            }
        }
        .navigationBarTitle("City list")
        .onTapGesture {
            if self.keyboardOpen {
                UIApplication.shared.endEditing()
                self.keyboardOpen = false
            }
        }
    }
}

Знаете ли вы, можно ли одновременно нажимать на жесты и следить за подробностями?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

На самом деле это должно работать, но это не связано с ошибкой .all GestureMask. Я отправил отзыв в Apple # FB7672055 и рекомендую сделать то же самое для всех, кого это касается, чем больше, тем лучше.

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

Протестировано с Xcode 11.4 / iOS 13.4

extension UIApplication {  // just helper extension
    static func endEditing() {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
    }
}

struct TestEndEditingOnNavigate: View {
    @State private var cities = ["London", "Berlin", "New York"]
    @State private var searchTerm = ""
    @State private var tappedLink: String? = nil // track tapped link

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Search", text: $searchTerm)
                }

                Section {
                    List {
                        ForEach(cities, id: \.self) { city in
                            self.link(for: city) // decompose for simplicity
                        }
                    }
                }
            }
            .navigationBarTitle("City list")
        }
    }

    private func link(for city: String) -> some View {
        let selection = Binding(get: { self.tappedLink }, // proxy bindng to inject...
            set: {
                UIApplication.endEditing()           // ... side effect on willSet
                self.tappedLink = $0
        })
        return NavigationLink(destination: Text("city: \(city)"), tag: city, selection: selection) {
            Text("\(city)")
        }
    }
}
0 голосов
/ 22 апреля 2020

Я думаю, что вы могли бы легко справиться с этим сценарием с помощью логических флагов, когда ваша клавиатура открывается, вы можете установить флаг как истинный, а когда он отклоняется, флаг возвращается к ложному, так что в этом случае, когда клавиатура открыта и нажатие срабатывает жест, вы можете проверить, активен ли флаг клавиатуры, а не go для детализации, но вместо этого эффективно отклонить клавиатуру и наоборот. Дайте мне знать, если я вас неправильно понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...