Команда «Отметить как избранное» работает не так, как ожидалось

#swiftui #command

Вопрос:

Я кодировал по учебнику apple «Ориентиры» и столкнулся с проблемой, связанной с командой «отметить как избранное» на панели инструментов меню. https://developer.apple.com/tutorials/swiftui/creating-a-macos-app#Add-a-Custom-Menu-Command Предполагается, что он должен получить выбранный элемент ориентира из списка a по значению @FocusedBinding, но он обновляется неправильно. Вы можете загрузить проект и запустить его локально, но вот мой вопрос:

В файле LandmarksCommand:

 struct LandmarkCommands: Commands {
  private struct MenuContent: View {
    @FocusedBinding(.selectedLandmark) var selectedLandmark: Landmark?

      var body: some View {
        Button("(selectedLandmark?.isFavorite == true ? "Remove" : "Mark") as Favorite") {
            selectedLandmark?.isFavorite.toggle()
        }
        .keyboardShortcut("f", modifiers: [.shift, .option])
        .disabled(selectedLandmark == nil)
      }
  }
  
  var body: some Commands {
    SidebarCommands()
    CommandMenu("Landmark") {
      MenuContent()
  }
}
 

Кнопка помечается как отключенная (или нет), если отметка выбранной страны равна нулю (или нет), но кнопка всегда отключена, даже если вы выбираете ориентир из списка. Я отследил действие отладчика и обнаружил, что .selectedLandmark действительно получает значение точки данных из modelData. Поскольку меню состоит только из одной кнопки, я попытался уменьшить накладные расходы и удалил структуру MenuContent с областью действия следующим образом:

 struct LandmarkCommands: Commands {
  @FocusedBinding(.selectedLandmark) var selectedLandmark: Landmark?
  var body: some Commands {
    SidebarCommands()
    CommandMenu("Landmark") {
      Button("(selectedLandmark?.isFavorite == true ? "Remove" : "Mark") as Favorite") {
          selectedLandmark?.isFavorite.toggle()
      }
      .keyboardShortcut("g", modifiers: [.shift, .option])
      .disabled(selectedLandmark == nil)
    }
  }
}
 

и, к моему большому удовлетворению, это сработало! Что я теперь хочу знать, так это почему? Я предполагаю, что это будет асинхронное обновление данных без правильного обновления представления, но в настоящее время у меня недостаточно внутренних знаний для Swift.