Проблемы, возникающие при переходе с основного контроллера на контроллеры на основе страниц в WatchOS с использованием SwiftUI - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь сделать что-то вроде этого , используя SwiftUI. Пока у меня есть возможность перейти от одного основного вида к просмотрам на основе страниц, но я не могу прокручивать просмотры страниц.

Раскадровка выглядит следующим образом: enter image description here

Как видите, у меня нет segues или next page relationships в раскадровке.

Я реализую их в коде в WKHostingController из HC3 (средний изтри).

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

Проблема в том, что я не могу перемещаться между представлениями на основе страниц.

Другие HostingControllers имеют класс типа WKHostingController следующим образом:

class HC[#]: WKHostingController<CV> {
    override var body: CV {
        return CV()
    }
}

Они имеют класс, назначенный в Инспекторе удостоверений, и у них также есть указанный идентификатор в Инспекторе атрибутов.

Я перехожу с основного контроллера на контроллеры на основе постраничной передачи с помощью NavigationLink Вот представление или главный хост-контроллер:

struct ContentView: View {
    var body: some View {
        NavigationLink(destinationName: "HC3"){
            Text("Go to HC3")
        }
    }
}

Пример:

enter image description here

Я получаю некоторые ошибки в консоли при попытке перейти на другие страницы в контроллере на основе страниц:

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

    .
    .
    .
    .

1 Ответ

1 голос
/ 25 октября 2019

В вашем дизайне есть логическая ошибка. Функция 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.

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