基于页面的界面使用多个相同的视图控制器

Page based interface use multiple of the same viewcontrollers

我想在 WatchKit 中创建一个基于页面的界面。

docs 声明必须创建多个界面控制器,link 它们才能创建基于页面的界面。

假设我有几个对象,我想为每个对象在手表上显示信息。然后我想使用基于页面的导航来滑动到下一个项目。所有项目都使用相同的界面控制器,只是数据不同。

有什么办法可以实现吗?

假设您为每个页面关联了相同的 InterfaceController,要将不同的数据传递给每个页面,请遵循以下步骤:

  1. 创建一个初始视图控制器,它会像飞溅一样 您的应用的屏幕。
  2. 在初始视图控制器的 "willActivate" 中,创建一个数组 页面和一组包含您需要传递的数据的上下文 到每个页面(interfaceViewControllers)。
  3. 调用WKInterfaceController.reloadRootControllersWithNames(页数, 上下文:pageContexts).
  4. 在 "awakeWithContext" 的每个公共 InterfaceController 中 页面,阅读上下文并初始化 properties/data.

点号3 基本上保证了你的页面显示的时候就像直接启动一样。您的另一个选择是使用 self.presentControllerWithNames,但这会在左上角显示一个 "Cancel" 按钮。

示例代码: 在 SplashScreen 界面控制器中

override func willActivate() {
    super.willActivate()
    let pages = ["page1","page2","page3","page4"]
    let pageContexts = [["data1":0,"data2":0],["data1":38,"data2":1],["data1":49,"data2":1],["data1":74,"data2":2]]
    WKInterfaceController.reloadRootControllersWithNames(pages, contexts: pageContexts)
}

在页面界面控制器中

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    if let contextDict:Dictionary = context as Dictionary<String,AnyObject>!
    {
        data1 = contextDict["data1"] as Int
        data2 = contextDict["data2"] as NSTimeInterval
    }
}

如果您没有像下面这样定义静态,将 reloadRootControllersWithNames 放在 willActivate 中会导致无限循环。

static BOOL first = YES;
- (void)willActivate {
    // This method is called when watch view controller is about to be visible to user
    [super willActivate];

    if (first) {
        [WKInterfaceController reloadRootControllersWithNames:[NSArray arrayWithObjects:@"SinglePageICIdentifier",@"SinglePageICIdentifier", nil] contexts:[NSArray arrayWithObjects:@"First",@"Second", nil]];
        first = NO;
    }
}