Одно представление не перерисовывается при изменении @State var в зависимости от выбора Picker - PullRequest
0 голосов
/ 31 января 2020

Попытка создать простое приложение MacOS, используя SwiftUI. У меня есть представление, которое содержит средство выбора, привязанное к состоянию var. В качестве проверки работоспособности я добавил текстовые представления (дварфы и тома ... itemName), которые также должны меняться в зависимости от изменений Picker. И они делают, но представление, которое я хочу перерисовать (FileList) не делает.

Я подозреваю, что это как-то связано с тем, как я пытаюсь передать новый FileSystemItem (внутренний класс) в FileList. Например, когда FilePanel выполняет повторную визуализацию, volumeSelection возвращается к 0, и состояние применяется впоследствии. Так что моя проблема в том, что мне, кажется, не хватает фундаментальной концепции о том, как эти данные должны передаваться. Я снова просмотрел информацию WWD C и читал другие статьи, но не вижу ответа.

Требуемое поведение при изменении выбора в средстве выбора должно приводить к отображению нового FileSystemItem в Просмотр списка файлов. Как правильно это сделать? Чтобы сформулировать это более обобщенно, как получить дочернее представление для отображения новых данных при изменении выбора Пикера?

struct FilePanel: View 
{
    @State var volumeSelection = 0
    @State var pathSelection = 0

    var volumes = VolumesModel() //should be passed in?
    var dwarves = ["Schlumpy","Wheezy","Poxxy","Slimy","Pervy","Drooly"]

    var body: some View {
        VStack {
            Picker(selection: $volumeSelection, label:
                Text("Volume")
                , content: {
                    ForEach (0 ..< volumes.count()) {
                        Text(self.volumes.volumeAtIndex(index: $0).itemName).tag($0)
                    }
            })

            FileList(item:volumes.volumeAtIndex(index: volumeSelection)).frame(minWidth: CGFloat(100.0), maxHeight: .infinity)
            Text(dwarves[volumeSelection])
            Text(volumes.volumeAtIndex(index: volumeSelection).itemName)

        }
    }
 }

struct FileList: View {
    @State var item : FileSystemItem

    var body: some View {
        VStack {
        List(item.childItems){fsi in
            FileCell(expanded:false, item: fsi)
        }
        Text(item.itemName)
        }
    }
}

1 Ответ

0 голосов
/ 01 февраля 2020

@State является частным состоянием для владельца, FileList никогда не увидит никаких изменений.

Если VolumesModel была простой структурой, то преобразование FileList.item в привязку (in-out-state) может уже работать (вызывающий все еще должен превратить @State в привязку при передаче его в зависит от $):

struct FileList: View {
  @Binding var item : FileSystemItem
  ...
}

Однако создается впечатление, что VolumesModel был более сложным объектом, имеющим массив членов.

В этом случае вышеприведенного будет недостаточно:

  • VolumesModel должен быть класс, принимающий ObservableObject
  • VolumesModel, важный элементам требуется привязываемая оболочка (@Published)
  • FileList.item следует превратить в @ObservedObject (вместо @State или @Binding)
  • FilePanel.volumes также должно быть @ObservedObject обернутый

Надеюсь, это поможет или, по крайней мере, укажет вам правильное направление.

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