使用 SwiftUI 在 WatchOS 中实现从主控制器到基于页面的控制器的导航问题
Issues implementing navigation from a main controller to page based controllers in WatchOS using SwiftUI
我正在尝试使用 SwiftUI 做类似 的事情。到目前为止,我可以从一个主视图转到基于页面的视图,但我无法在页面视图之间滚动。
情节提要如下所示:
如您所见,故事板中没有任何 segues
或 next page relationships
。
我正在 HC3
的 WKHostingController
(三个中的中间一个)的代码中实现这些代码。
HostingController
共 HC3
:
class HC3: WKHostingController<CV> {
override func awake(withContext context: Any?) {
super.awake(withContext: context)
WKInterfaceController.reloadRootPageControllers(withNames: ["HC2", "HC3", "HC4"], contexts: [context] , orientation: WKPageOrientation.horizontal, pageIndex: 1)
}
override var body: CV {
return CV()
}
}
问题是我无法在基于页面的视图之间导航。
其他 HostingController 有一个 WKHostingController
类型的 class,如下所示:
class HC[#]: WKHostingController<CV> {
override var body: CV {
return CV()
}
}
他们在身份检查器中分配了 classed,并且在属性检查器中也有指定的 ID。
我正在使用 NavigationLink
从主控制器导航到基于分页的控制器这是视图或主托管控制器:
struct ContentView: View {
var body: some View {
NavigationLink(destinationName: "HC3"){
Text("Go to HC3")
}
}
}
示例:
当尝试导航到基于页面的控制器中的其他页面时,我确实在控制台中遇到了一些 错误 :
ComF: interfaceController for interfaceControllerID:13F0353 not found (clientIdentifier=(null))
SampleApp WatchKit Extension[319:69539] [default] -[SPRemoteInterface _interfaceControllerClientIDForControllerID:]:2358: ComF: clientIdentifier for interfaceControllerID:13F0353 not found. callStack:(
0 WatchKit 0x36dd72fc 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 172796
1 WatchKit 0x36dd90cc 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 180428
2 WatchKit 0x36dcf2cc spUtils_dispatchAsyncToMainThread + 40
3 WatchKit 0x36dd8db8 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 179640
4 WatchKit 0x36dcf2cc spUtils_dispatchAsyncToMainThread + 40
5 WatchKit 0x36dd6688 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 169608
6 WatchKit 0x36dd6564 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 169316
7 WatchKit 0x36dcd9f4 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 133620
8 WatchKit 0x36dd632c 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 168748
9 WatchKit 0x36dd623c 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 168508
10 WatchKit 0x36db0b74 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 15220
11 WatchKit 0x36dbae94 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 56980
12 UIKitCore 0x4148aaf0 78873E50-5E9B-3AA3-A471-366668659CA2 + 9235184
13 UIKitCore 0x40d750ec 78873E50-5E9B-3AA3-A471-366668659CA2 + 1806572
14 UIKitCore 0x40d75454 78873E50-5E9B-3AA3-A471-366668659CA2 + 1807444
15 UIKitCore 0x40d74cf0 78873E50-5E9B-3AA3-A471-366668659CA2 + 1805552
16 UIKitCore 0x40d7934c 78873E50-5E9B-3AA3-A471-366668659CA2 + 1823564
17 UIKitCore 0x410af7f0 78873E50-5E9B-3AA3-A471-366668659CA2 + 5191664
18 UIKitCore 0x41185800 _UISceneSettingsDiffActionPerformChangesWithTransitionContext + 244
.
.
.
.
您的设计存在逻辑错误。 reloadRootPageController
函数应该在顶部 WKHostingController 中调用,但是 "HC3"。
class HostingController: WKHostingController<ContentView> {
override func awake(withContext context: Any?) {
super.awake(withContext: context)
WKInterfaceController.reloadRootPageControllers(withNames: ["HC2", "HC3", "HC4"], contexts: [context] , orientation: WKPageOrientation.horizontal, pageIndex: 1)
}
override var body: ContentView {
return ContentView()
}
}
如果在HC3中调用了reloadRootPageControllers
,奇怪的情况就是你遇到的
否则,您必须在 HC3 设置中添加 conditional_once。
class HC3: WKHostingController<CV> {
static var runOnce: Bool = true
override func awake(withContext context: Any?) {
super.awake(withContext: context)
if HC3.runOnce { HC3.runOnce.toggle()
WKInterfaceController.reloadRootPageControllers(withNames: ["HC2", "HC3", "HC4"], contexts: [context] , orientation: WKPageOrientation.horizontal, pageIndex: 1)
}
}
override var body: CV {
return CV()
}
}
我正在尝试使用 SwiftUI 做类似
情节提要如下所示:
如您所见,故事板中没有任何 segues
或 next page relationships
。
我正在 HC3
的 WKHostingController
(三个中的中间一个)的代码中实现这些代码。
HostingController
共 HC3
:
class HC3: WKHostingController<CV> {
override func awake(withContext context: Any?) {
super.awake(withContext: context)
WKInterfaceController.reloadRootPageControllers(withNames: ["HC2", "HC3", "HC4"], contexts: [context] , orientation: WKPageOrientation.horizontal, pageIndex: 1)
}
override var body: CV {
return CV()
}
}
问题是我无法在基于页面的视图之间导航。
其他 HostingController 有一个 WKHostingController
类型的 class,如下所示:
class HC[#]: WKHostingController<CV> {
override var body: CV {
return CV()
}
}
他们在身份检查器中分配了 classed,并且在属性检查器中也有指定的 ID。
我正在使用 NavigationLink
从主控制器导航到基于分页的控制器这是视图或主托管控制器:
struct ContentView: View {
var body: some View {
NavigationLink(destinationName: "HC3"){
Text("Go to HC3")
}
}
}
示例:
当尝试导航到基于页面的控制器中的其他页面时,我确实在控制台中遇到了一些 错误 :
ComF: interfaceController for interfaceControllerID:13F0353 not found (clientIdentifier=(null))
SampleApp WatchKit Extension[319:69539] [default] -[SPRemoteInterface _interfaceControllerClientIDForControllerID:]:2358: ComF: clientIdentifier for interfaceControllerID:13F0353 not found. callStack:(
0 WatchKit 0x36dd72fc 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 172796
1 WatchKit 0x36dd90cc 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 180428
2 WatchKit 0x36dcf2cc spUtils_dispatchAsyncToMainThread + 40
3 WatchKit 0x36dd8db8 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 179640
4 WatchKit 0x36dcf2cc spUtils_dispatchAsyncToMainThread + 40
5 WatchKit 0x36dd6688 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 169608
6 WatchKit 0x36dd6564 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 169316
7 WatchKit 0x36dcd9f4 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 133620
8 WatchKit 0x36dd632c 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 168748
9 WatchKit 0x36dd623c 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 168508
10 WatchKit 0x36db0b74 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 15220
11 WatchKit 0x36dbae94 0045BA6A-0953-3B1D-915F-6ADB695CD163 + 56980
12 UIKitCore 0x4148aaf0 78873E50-5E9B-3AA3-A471-366668659CA2 + 9235184
13 UIKitCore 0x40d750ec 78873E50-5E9B-3AA3-A471-366668659CA2 + 1806572
14 UIKitCore 0x40d75454 78873E50-5E9B-3AA3-A471-366668659CA2 + 1807444
15 UIKitCore 0x40d74cf0 78873E50-5E9B-3AA3-A471-366668659CA2 + 1805552
16 UIKitCore 0x40d7934c 78873E50-5E9B-3AA3-A471-366668659CA2 + 1823564
17 UIKitCore 0x410af7f0 78873E50-5E9B-3AA3-A471-366668659CA2 + 5191664
18 UIKitCore 0x41185800 _UISceneSettingsDiffActionPerformChangesWithTransitionContext + 244
.
.
.
.
您的设计存在逻辑错误。 reloadRootPageController
函数应该在顶部 WKHostingController 中调用,但是 "HC3"。
class HostingController: WKHostingController<ContentView> {
override func awake(withContext context: Any?) {
super.awake(withContext: context)
WKInterfaceController.reloadRootPageControllers(withNames: ["HC2", "HC3", "HC4"], contexts: [context] , orientation: WKPageOrientation.horizontal, pageIndex: 1)
}
override var body: ContentView {
return ContentView()
}
}
如果在HC3中调用了reloadRootPageControllers
,奇怪的情况就是你遇到的
否则,您必须在 HC3 设置中添加 conditional_once。
class HC3: WKHostingController<CV> {
static var runOnce: Bool = true
override func awake(withContext context: Any?) {
super.awake(withContext: context)
if HC3.runOnce { HC3.runOnce.toggle()
WKInterfaceController.reloadRootPageControllers(withNames: ["HC2", "HC3", "HC4"], contexts: [context] , orientation: WKPageOrientation.horizontal, pageIndex: 1)
}
}
override var body: CV {
return CV()
}
}