SwiftUI: можно ли вызвать набор PreferenceKey () из .OnTapGesture? - PullRequest
1 голос
/ 19 марта 2020

Я занимаюсь разработкой приложения со следующей структурой ContentView

    ContentView {
    ---HeaderView
    ---Collection view using QGrid (An Array of Cells), data source: an array of Structs
    ---A Detail View of data from a single data Struct from the data array
}

Цель состоит в том, чтобы обновить дочернее представление Detail с данными из повернутой ячейки в QGrid. У меня есть вид ячейки, который распознает касания и правильно сообщает, какая ячейка для консоли. .OnTap корректно изменяет представление Cell, но я могу только прикрепить настройку Preference за пределами представления Cell, поэтому он вызывает изменение Pref каждый раз, когда ячейка отображается в QGrid, оставляя сообщенную ячейку как последнюю в сетке, но никогда не обновляет выбранную ячейку при нажатии!

struct GlyphCell: View {

    var glyph:Glyph

    var body: some View {
        ZStack {
            Text("\(glyph.Hieroglyph)")
                .lineLimit(1)
                .padding(.all, 12.0)
                .font(.system(size: 40.0))
                .background(Color.yellow)
            Text("\(glyph.Gardiner)")
                .offset(x: 12, y: 26)
                .foregroundColor(.blue)
        }.onTapGesture {
            print("Tap on \(self.glyph.Gardiner)")
            DispatchQueue.main.async {
                // would like to update preference in here!
                }
            }
        .preference(key: TappedGlyphPreferenceKey.self, value: self.glyph)
        .cornerRadius(6.0)
        .frame(width: 90.0, height: 100.0, alignment: .center)
        .previewLayout(.sizeThatFits)
    }
}

Может ли это быть достигнуто с помощью этого подхода, т. е. передачи Pref до родительского представления, а затем до целевого представления Detail? Я попробовал обертки State и Observables для выбранных данных Struct, но с ними ничего не вышло. Любые мысли приветствуются!

Обновление: у меня должно быть неправильное понимание State / Bind. У меня есть переменная @State структуры данных в родительском представлении содержимого, которое я использую для обновления дочернего представления. Когда я добавил @Bind этой переменной Struct в подпредставление Cell, мне нужно, чтобы компилятор добавил эту переменную в список параметров для Sub-view Cell. Когда я добавляю это, я получаю все виды ошибок. Я попробовал несколько вариантов, но отказался от Bind, чтобы попробовать префы. Напомним, я хочу передать выбранную структуру ячеек вверх по дереву, а затем перейти к деталям. Я могу попытаться воссоздать ошибку, если вы достаточно щедры, чтобы взглянуть.

1 Ответ

1 голос
/ 19 марта 2020

Попробуйте следующее (не может проверить это из-за отсутствия многих зависимостей, так что просто идея)

struct GlyphCell: View {

    var glyph:Glyph

    @State private var selected = false   // << track own selection
    var body: some View {
        ZStack {
            Text("\(glyph.Hieroglyph)")
                .lineLimit(1)
                .padding(.all, 12.0)
                .font(.system(size: 40.0))
                .background(Color.yellow)
            Text("\(glyph.Gardiner)")
                .offset(x: 12, y: 26)
                .foregroundColor(.blue)
        }.onTapGesture {
            print("Tap on \(self.glyph.Gardiner)")
            self.selected.toggle() // << async not required here
        }
        .cornerRadius(6.0)
        .frame(width: 90.0, height: 100.0, alignment: .center)
        .previewLayout(.sizeThatFits)
        .background(Group {
           if self.selected {
                // activate preference only when selected
                Color.clear
                    .preference(key: TappedGlyphPreferenceKey.self, value: self.glyph)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...