Структура приложения довольно проста, оно содержит NavigationsPlitView с MasterView и DetailView . Иерархия в DetailView , я использую FocusedSceneObject и FocusedSceneValue для предоставления DetailSiewModel и в настоящее время выбранного элемента to appcommands .
Код: Выделить всё
struct DetailView: View {
@StateObject private var viewModel: DetailViewModel = .init()
let item: Item?
var itemTitle: String { item?.title ?? "nil" }
var body: some View {
let _ = Self._printChanges()
Group {
if let item = item {
SelectedItemView(viewModel: self.viewModel, item: item)
} else {
ContentUnavailableView("Select an Item",
systemImage: "list.bullet",
description: Text("Choose an item from the list to see its details"))
}
}
.alert(
"Alert",
isPresented: self.$viewModel.presentedAlert,
actions: {
Button("OK", role: .cancel) {
self.viewModel.presentedAlert = false
}
},
message: {
Text("Presented from detail view with item: \(self.itemTitle)")
})
.navigationTitle(item?.title ?? "Detail")
.onChange(of: self.item) { _, newValue in
viewModel.updateItem(newValue)
}
// Provide currently selecteItem and viewModel to AppCommands via @FocusedValue/@FocusedObject
.focusedSceneValue(\.selectedItem, self.item)
.focusedSceneObject(self.viewModel)
}
}
Код: Выделить всё
@main
struct MyApp: App {
var body: some Scene {
WindowGroup(id: "main") {
ContainerView()
}
.commands {
AppCommands()
}
}
}
// MARK: - AppCommands
struct AppCommands: Commands {
@FocusedValue(\.selectedItem) private var selectedItem: Item?
@FocusedObject private var viewModel: DetailViewModel?
var body: some Commands {
let _ = print("AppCommands")
let _ = print("Focused view model: \(pointer(self.viewModel))")
let _ = print("Focused selectedItem: \(selectedItem?.title ?? "nil")")
CommandGroup(after: .newItem) {
Button("Focused View Model Command") {
print("executing command with focused view model: \(pointer(self.viewModel))")
viewModel?.presentedAlert = true
}
.keyboardShortcut(.return, modifiers: [.command])
Button("Selected Item Command") {
print("executing command with selected item: \(self.selectedItem?.title ?? "nil")")
}
.keyboardShortcut(.return, modifiers: [.command, .shift])
}
}
}
Это прекрасно работает с любым числом Windows на Mac. Однако, когда в приложении есть две окна, открытые на iPad (например, разделительное представление), @focuseBject и @focusedValue неправильно обновляются со значением и объектом из активного окна в данный момент (окно активируется по нему). < /P>
Здесь есть запись экрана с продемонстрированным вопросом. Я делаю что -то не так или это ошибка в Swiftui на iOS?
Подробнее здесь: https://stackoverflow.com/questions/796 ... -on-ipados
Мобильная версия