Как отправить команду ключа в в настоящее время активное окно на iPados?IOS

Программируем под IOS
Ответить
Anonymous
 Как отправить команду ключа в в настоящее время активное окно на iPados?

Сообщение Anonymous »

В приложении iOS с жизненным циклом Switui, который поддерживает несколько окон, я определил основные элементы меню с использованием .commands в Windowgroup .
Структура приложения довольно проста, оно содержит 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)
}
}
Вот как настраиваются appcommads :

Код: Выделить всё

@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])
}
}
}
Идея проста, когда представлен Definteview , выполняя команду из основного меню (или нажатие на сочетание клавиатуры) должно выполнить действие по модели представления, связанного с представленным в настоящее время DeftainView .
Это прекрасно работает с любым числом Windows на Mac. Однако, когда в приложении есть две окна, открытые на iPad (например, разделительное представление), @focuseBject и @focusedValue неправильно обновляются со значением и объектом из активного окна в данный момент (окно активируется по нему). < /P>
Здесь есть запись экрана с продемонстрированным вопросом. Я делаю что -то не так или это ошибка в Swiftui на iOS?

Подробнее здесь: https://stackoverflow.com/questions/796 ... -on-ipados
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»