Свойство UndoManager canUndo не обновляется в SwiftUI - PullRequest
1 голос
/ 12 марта 2020

Почему @Environment UndoManager не обновляет свое свойство canUndo, когда в его стеке есть действия? У меня есть представление, в котором есть дочерний элемент, который может использовать функцию отмены / возврата, но по какой-то причине я не могу отключить кнопку отмены в зависимости от менеджера.

struct MyView: View {
    @Environment(\.undoManager) var undoManager: UndoManager?

    var body: some View {
        Button("Undo") { ... }
            .disabled(!self.undoManager!.canUndo)
    }
}

1 Ответ

1 голос
/ 12 марта 2020

UndoManager.canUndo не соответствует стандарту KVO, поэтому используйте некоторых издателей уведомлений для отслеживания состояния, как показано ниже

struct MyView: View {
    @Environment(\.undoManager) var undoManager
    @State private var canUndo = false

    // consider also other similar notifications
    private let undoObserver = NotificationCenter.default.publisher(for: .NSUndoManagerDidCloseUndoGroup)

    var body: some View {
        Button("Undo") { }
            .disabled(!canUndo)
            .onReceive(undoObserver) { _ in
                self.canUndo = self.undoManager!.canUndo
            }
    }
}
...