将 WKInterfaceController 类升级到新的 SwiftUI 结构/视图

Fab*_*ein 5 swift watchos swiftui

目前在 iOS 和 watchOS 上都有运行的解决方案。随着 SwiftUI 即将到来的好消息,可能性正在扩大,同时我们对它的疑虑也随之增加。我的问题是:我有很多:

import WatchKit
import Foundation

class LoginInterfaceController : WKInterfaceController {
    @IBOutlet weak var label: WKInterfaceLabel!
    var timer: Timer!
    var connection = true
...
Run Code Online (Sandbox Code Playgroud)

我想将这些观点转变为:

import SwiftUI

@available(watchOSApplicationExtension 6.0, *)
struct FirstView: View {
    var body: some View {
        LoginView(email: "", pass: "")
    }
}

@available(watchOSApplicationExtension 6.0, *)
struct LoginView : View {
    @State var email: String
    @State var pass: String
    
    var body: some View {
        VStack(alignment: .leading) {
...
Run Code Online (Sandbox Code Playgroud)

如何调用并呈现新的View?今天我打电话给这样的人:presentController(withName: "LoginPlease", context: text)找不到旧视图的东西呈现新视图......

Mat*_*ini 5

要呈现纯 SwiftUI 视图,请使用WKHostingController.

有关此内容的更多信息,请参阅这个精彩的 WWDC 2019 视频:watchOS 上的 SwiftUI

例子

class HostingController: WKHostingController<MyView> {
    override var body: MyView {
       MyView()
    }
}
Run Code Online (Sandbox Code Playgroud)

要重用现有的接口对象,请创建一个符合WKInterfaceObjectRepresentable.

例子

struct WatchMapView: WKInterfaceObjectRepresentable {
    var landmark: Landmark

    func makeWKInterfaceObject(context: WKInterfaceObjectRepresentableContext<WatchMapView>) -> WKInterfaceMap {
        // Return the interface object that the view displays.
        return WKInterfaceMap()
    }

    func updateWKInterfaceObject(_ map: WKInterfaceMap, context: WKInterfaceObjectRepresentableContext<WatchMapView>) {
        // Update the interface object.
        let span = MKCoordinateSpan(latitudeDelta: 0.02,
                                    longitudeDelta: 0.02)

        let region = MKCoordinateRegion(
            center: landmark.locationCoordinate,
            span: span)

        map.setRegion(region)
    }
}
Run Code Online (Sandbox Code Playgroud)

当涉及到重用预先存在的视图时,集成 SwiftUI是您正在寻找的 WWDC 视频。

这也是一个很棒的资源:Building watchOS App Interfaces with SwiftUI