SwiftUI: включение цифровой заводной головки для часов с помощью изменения фокуса

#swift #swiftui #watchkit #apple-watch #watchos

Вопрос:

Я хочу предоставить кнопку, которая включит цифровую заводную головку Apple Watch для ввода. Это включает в себя обеспечение того, чтобы что-то было сфокусировано, что приведет к изменениям короны. У меня есть небольшой тестер для этого:

Снимок Экрана Apple Watch

Когда вы нажмете кнопку «Включить заводную головку», я хочу начать получать изменения заводной головки.

Вот код, который я создал:

 struct ContentView: View {
    @State var crownValue = 0.0
    @Namespace private var namespace
    @Environment(.resetFocus) var resetFocus
    @State var forceFocus = false
    
    var body: some View {
        ScrollView {
            VStack {
                Button("Button") {
                }
                .focusable(forceFocus)
                .prefersDefaultFocus(true, in: namespace)
                Text("(crownValue)")
            }
            .digitalCrownRotation($crownValue)
            
            // Goal is for this button to give focus to other button and start capturing
            // digital crown changes; but have to touch this button twice to get desired
            // effect
            Button("Enable Crown") {
                print("Enabling crown")
                forceFocus = true
                resetFocus(in: namespace)
            }
        }
        .focusScope(namespace)
    }
}
 

Это работает, но только если я дважды нажму кнопку «Включить заводную головку»!

Есть идеи, как достичь моей цели? Полный исходный код этого примера находится по адресу https://github.com/t9mike/DigitalCrownHelp2.

Ответ №1:

Я слишком все усложнял. Следующее работает нормально, сохраняя фокус на кнопке, которая используется для включения функции заводной головки:

 struct ContentView: View {
    @State var crownValue = 0.0
    
    var body: some View {
        ScrollView {
            Text("(crownValue)")

            Button("Enable Crown") {
                print("Enabling crown")
            }
            .focusable()
        }
        .digitalCrownRotation($crownValue)
    }
}