我想在 watchOS6 中创建 SwiftUI 视图时注入 EnvironmentObject。
但是由于 WKHostingController 需要一个具体类型,我无法执行以下操作 ContentView().environmentObject(UserData())
class HostingController: WKHostingController<ContentView> {
override var body: ContentView {
return ContentView().environmentObject(UserData())
}
}
Run Code Online (Sandbox Code Playgroud)
此代码失败并出现以下错误:
无法将“some View”类型的返回表达式转换为“ContentView”类型
我见过这样的解决方法: 在 watchOS 中使用 environmentObject这似乎是一个黑客而不是一个正确的解决方案。
我问关于同在Twitter上watchOS工程师,他的回答是地方.environmentObject(UserData())的主体内ContentView()。我尝试这样做,但 Xcode 报告错误。
那么有没有人找到一种方法来做同样的事情?
我正在使用 SwiftUI 在 watchOS 上使用Apple实现登录。
由于WKInterfaceAuthorizationAppleIDButton不符合 View 协议,我将它包装起来WKInterfaceObjectRepresentable用于在 SwiftUI 视图中使用它。
我已经实现了一个协调器来处理按钮上的点击,它还充当注册过程回调的委托。
下面是我的代码:
struct AppleLoginButton: WKInterfaceObjectRepresentable {
typealias WKInterfaceObjectRepresentable = WKInterfaceObjectRepresentableContext<AppleLoginButton>
func updateWKInterfaceObject(_ wkInterfaceObject: WKInterfaceAuthorizationAppleIDButton, context: WKInterfaceObjectRepresentableContext<AppleLoginButton>) {
// No code required
}
class Coordinator: NSObject, ASAuthorizationControllerDelegate {
@objc func buttonPressed(_ sender: WKInterfaceAuthorizationAppleIDButton) {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.performRequests()
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { …Run Code Online (Sandbox Code Playgroud)