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

时间:2019-06-14 21:40:27

标签: swift watch-os 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)的东西,找不到适合旧视图的东西,而要呈现新的视图...

2 个答案:

答案 0 :(得分:0)

要显示纯SwiftUI视图,请使用WKHostingController

有关此WWDC 2019精彩视频的更多信息:SwiftUI on watchOS

示例

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)
    }
}

Integrating SwiftUI是重用现有视图时要查找的WWDC视频。

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

答案 1 :(得分:0)

struct MainView : View {
    let host: HostingController!
    var body: some View {
        List {
            ListCell(icon: "list_ic_playing", title: "正在播放").tapAction {
                self.host.presentNowPlaying()
            }    
        }
        .navigationBarTitle(Text("喜马拉雅"))
    }
}

class HostingController : WKHostingController<MainView> {
    override var body: MainView {
        return MainView(host: self)
    }
    func presentNowPlaying() {
        self.presentController(withNames: ["PlayList", "NowPlaying"], contexts: nil)
    }
}