1

SwiftUISignInWithAppleButtonsignInWithAppleButtonStyle. ユーザーの現在のスキームに基づいて、または変更された場合にボタンの色を変更しようとしています。これは iOS 14 と SwiftUI です。

@Environment(\.colorScheme) var currentScheme
@State var appleButtonWhite = false

VStack{
SignInWithAppleButton(
                .signUp,
                onRequest: { request in              
                    request.requestedScopes = [.fullName, .email]
                },
                onCompletion: { result in
                    switch result {
                    case .success (let authResults):
                        print("Authorization successful.")
       
                    case .failure (let error):
                        print("Authorization failed: " + error.localizedDescription)
                    }
                }
            )
            .frame(minWidth: 0, maxWidth: .infinity)
            .signInWithAppleButtonStyle(appleButtonWhite ? .white : .black)
}
.onChange(of: currentScheme, perform: { (scheme) in
        if scheme == .light
        {
            appleButtonWhite = false
        }
        else
        {
            appleButtonWhite = true
        }
    })

値を変更するappleButtonWhiteと、状態が変化しているため、ビューが適切にレンダリングされます。ボタンをデバッグすると、正しい appleButtonWhite 値が表示されますが、何らかの理由でスタイルが変更されません。理由がわかりません。通常のボタンを使用してコードに多くのスタイル変更を加えましたが、さまざまな状態に基づいて正しく機能します。Apple が変更されない理由はありますか?

4

2 に答える 2

0

さらにエレガントなソリューションを書くことができます。上記のmrjohnslyの回答に基づいて

これは、Swift ビューを効率的に使用する方法を説明するリソースですhttps://developer.apple.com/wwdc21/10022

struct ContentView: View {
    @Environment(\.colorScheme) var currentScheme
    
    var body: some View {
        VStack {
            SignInWithAppleButton { request in
                // request handeling
            } onCompletion: { result in
                // result handeling
            }
            .signInWithAppleButtonStyle(currentScheme == .light ? .black : .white) // <- here
            .frame(width: 250, height: 45, alignment: .center)
        }
    }
}
于 2021-06-18T13:50:20.937 に答える