Привязка / подписка SwiftUI работает от UIKit до SwitUI, но изменяется не наблюдателем в SwiftUI View - PullRequest
0 голосов
/ 01 мая 2020

У меня есть представление в SwiftUI, которое я встроил в UITableViewCell (в земле UIKit). Подписка / привязка et c работает (поскольку я вижу операторы печати в ячейке таблицы против подписки), но в моем представлении SwiftUI изображение не переворачивается при переключении флага. Любая идея, почему?

public class CollapsableSectionViewModel: ObservableObject {
  @Published var isExpanded = true

  public init(isExpanded: Bool = true) {
    self.isExpanded = isExpanded
  }
}

public struct CollapsableTableSectionContentView: View {
  @Binding var sectionModel: CollapsableSectionViewModel

  public init(sectionModel: Binding<CollapsableSectionViewModel>) {
    self._sectionModel = sectionModel
  }

  public var body: some View {
    Button(action: {
      withAnimation {
        self.sectionModel.isExpanded.toggle()
      }
    }) {
      Image(systemName: "chevron.right")
        .font(.caption)
        .foregroundColor(Color(.white))
        .frame(minWidth: 16, minHeight: 16)
        .rotationEffect(.init(degrees: self.sectionModel.isExpanded ? 90 : 180))
        .padding(.trailing, 16)
    }
    .frame(minHeight: 44)
  }
}

И в UIKit:

...
let model = CollapsableSectionViewModel(isExpanded: true)

    innerHostedView = UIHostingController(rootView: CollapsableTableSectionContentView(sectionModel: .constant(model)))
    innerHostedView.view.translatesAutoresizingMaskIntoConstraints = false
    contentView.addSubview(innerHostedView.view)
    innerHostedView.view.backgroundColor = .clear

    NSLayoutConstraint.activate([
      innerHostedView.view.topAnchor.constraint(equalTo: self.contentView.topAnchor),
      innerHostedView.view.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor),
      innerHostedView.view.leadingAnchor.constraint(equalTo: self.contentView.safeAreaLayoutGuide.leadingAnchor),
      innerHostedView.view.trailingAnchor.constraint(equalTo: self.contentView.safeAreaLayoutGuide.trailingAnchor)
    ])

    expansionSubscription = innerHostedView.rootView.sectionModel.$isExpanded.sink { (expanded) in

      print("Expanded: \(expanded)")
    }
...

Expanded: true и Expanded: false печатаются на консоли, когда я нажимаю на кнопку, но изображение Chevron делает не изменять Как будто привязка не работает глубже в иерархии SwiftUI View.

1 Ответ

0 голосов
/ 01 мая 2020

Doh. Я случайно использовал @Binding, когда должен был использовать @ObservedObject. К этому нужно будет привыкнуть. Следующие изменения исправили привязку.

  @ObservedObject var sectionModel: CollapsableSectionViewModel
  @Environment(\.locale) var locale

  public init(sectionModel: CollapsableSectionViewModel) {
    self.sectionModel = sectionModel
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...