基于页面的界面使用多个相同的viewcontrollers

时间:2015-02-15 17:47:20

标签: ios objective-c watchkit

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

docs表示必须创建多个接口控制器并链接它们以创建基于页面的界面。

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

有什么方法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:4)

假设您已为每个页面关联相同的InterfaceController,要将不同的数据传递到每个页面,请按照下述步骤操作:

  1. 创建一个初始视图控制器,它将像一个启动一样 屏幕上显示您的应用。
  2. In" willActivate"初始视图控制器,创建一个数组 页面和包含您需要传递的数据的上下文数组 每个页面(interfaceViewControllers)。
  3. 调用WKInterfaceController.reloadRootControllersWithNames(pages, 上下文:pageContexts)。
  4. " awakeWithContext"你的常见InterfaceController的每一个 页面,读取上下文并初始化属性/数据。
  5. 点号。 3基本上确保您的页面显示为直接启动。其他选项是使用self.presentControllerWithNames,但这将显示"取消"左上角的按钮。

    示例代码: 在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
        }
    }
    

答案 1 :(得分:0)

如果你没有定义下面的静态,那么在willActivate中放置reloadRootControllersWithNames会导致无限循环。

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