首页 > 解决方案 > 将 WKInterfaceController 类升级到新的 SwiftUI 结构/视图

问题描述

目前在 iOS 和 watchOS 上有一个正在运行的解决方案。随着即将到来的 SwiftUI 的好消息,可能性正在扩大,同时我们对此表示怀疑。我的问题是:我有很多:

import WatchKit
import Foundation

class LoginInterfaceController : WKInterfaceController {
    @IBOutlet weak var label: WKInterfaceLabel!
    var timer: Timer!
    var connection = true
...

我想将这些观点转变为:

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) {
...

如何调用和呈现新视图?今天我称之为:presentController(withName: "LoginPlease", context: text),找不到旧视图的东西现在是一个新的......

标签: swiftwatchosswiftui

解决方案


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

在这个很棒的 WWDC 2019 视频中了解更多信息:watchOS 上的 SwiftUI

示例

class HostingController: WKHostingController<MyView> {
    override var body: MyView {
       MyView()
    }
}

要重用现有的接口对象,请创建一个符合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)
    }
}

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

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


推荐阅读