SwiftUI: метод PreferenceKey Reduce никогда не вызывается - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь передать данные в цепочку представлений с помощью Preferences, но .onPreferenceChange никогда не вызывается. Небольшое расследование показывает, что хотя отладчик показывает, что выполнение проходит через мой модификатор .Preference, метод reduce никогда не вызывается для pu sh нового значения в ключе. Я не могу понять, почему, и при этом я не могу найти способ исследовать ключ предпочтения Представления: значение данных.

вот код:

struct LittleTapPrefKey: PreferenceKey {
    typealias Value = String
    static var defaultValue: Value = "A0"
    static func reduce(value: inout Value, nextValue: () -> String) {
        print("Inside Little Reduce \(value)and NextVal =  \(nextValue())")
        value = nextValue()
    }
}

здесь - ячейка. для экземпляра GlyphCell в QGrid установлен модификатор Pref:

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: 28)
                .foregroundColor(.blue)
        }.onTapGesture {
            print("Tap on \(self.glyph.Gardiner)")
            self.selected.toggle()
        }
        .cornerRadius(6.0)
        .frame(width: 90.0, height: 100.0, alignment: .center)
        .previewLayout(.sizeThatFits)
        .background(Group {
            if self.selected {
                Color.clear
                    .preference(key: LittleTapPrefKey.self, value: self.glyph.Gardiner)
            } // end selected test
        }   // end  group
      )     // end .background
    }       // end cell body view
}

с точкой останова, установленной в .pref (key: ...), точка останова срабатывает при каждом касании ячейки, и значение self.glyph.Gardiner является правильным в этой точке.

Точки останова или тестовый оператор Print в структуре Preference Key Struct «уменьшить» никогда не срабатывают. Поскольку .onPrefChange никогда не запускается, я должен предположить, что значение никогда не изменяется, но у меня нет возможности напрямую просмотреть значение Pref.

Что происходит?

1 Ответ

0 голосов
/ 21 марта 2020

reduce вызывается, когда вы устанавливаете один ключ предпочтения в одной иерархии представлений несколько раз, поэтому SwiftUI дает вам возможность как-то их комбинировать, например:

.previewLayout(.sizeThatFits)
.preference(key: LittleTapPrefKey.self, value: value1) // 1st time
.background(Group {
    if self.selected {
        Color.clear
            .preference(key: LittleTapPrefKey.self, value: value2) // 2nd time
    }
}

, в вашем случае у вас есть только один Установщик значений, поэтому он просто установлен и .onPreferenceChange(LittleTapPrefKey.self) модификатор обратного вызова работает, как и ожидалось.

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

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