#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.