启动循环中基于页面的“reloadRootControllersWithNames:”?

时间:2015-03-10 00:08:51

标签: ios watchkit apple-watch

- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
    [WKInterfaceController reloadRootControllersWithNames:@[@"pageOne", @"pageTwo"] contexts:nil];
}

遵循Apple的指南

  

调用此方法重新加载应用基于页面的界面中的页面。在启动时,您可以使用此方法自定义要显示的页面集。

在发布时,只会导致循环。每次重新加载调用awakeWithContext或将一次又一次地激活或初始化。

是否有更好的方法可以在启动循环时重新加载基于页面的应用程序?

4 个答案:

答案 0 :(得分:21)

这是WatchKit应用程序的常见问题,因为我们不再需要UIApplicationDelegate来处理此类设置。一个好的方法是按如下方式构建代码:

  • MainInterfaceController(故事板中的主要链接指向此处)
  • PageOneInterfaceController - 您在页面集中显示的第一个界面
  • PageTwoInterfaceController - 您在页面集中的第二个界面

MainInterfaceController实际上永远不会显示。您将始终启动到一组不同的界面控制器,具体取决于MainInterfaceController.awakeWithContent()中配套iOS应用程序的缓存状态。这样,您使用MainInterfaceController的方式与我们在iOS中使用UIApplicationDelegate设置窗口和根视图控制器的方式类似。

我在一个应用程序中使用了这种方法,该应用程序有许多不同的页面集可供选择,而且效果非常好。

答案 1 :(得分:5)

这就是git branch --set-upstream-to=<remote>/<branch> develop 存在的原因。第一次启动您的应用时,初始控制器将awakeWithContext:作为nil传递。但是如果您context,您有机会传递自定义上下文实例,从而区分启动模式。

答案 2 :(得分:0)

调用WKInterfaceController.reloadRootControllers将导致第二次唤醒函数被调用。这是我使用的解决方案-它直接,紧凑并且消除了递归循环。这个示例有两个基于页面的视图,分别称为mainControls和nowPlaying,并使用上下文进行了配置。注意,这里的关键是使用空字符串上下文配置mainControls视图控制器,然后检查该上下文并返回是否由于WKInterfaceController.reloadRootControllers语句将上下文配置为“”而再次被调用。请注意,第一次唤醒运行时,主视图控制器的上下文将为nil。还要注意,第二个上下文是特定于我的实现的实现细节-这可以是您要传递给第二个视图控制器的任何对象。

override func awake(withContext context: Any?) {
    super.awake(withContext: context)
    if let _ = context as? String {
        print("already configured!")
        return
    }
    print("configuring...")
    WKInterfaceController.reloadRootControllers(withNames: ["mainControls", "nowPlaying"], contexts: ["", interaction])
}

答案 3 :(得分:-2)

非常容易解决,并且不需要多页控制器 - 只需使用一次

创建一个类变量(不是实例变量)并将其用作您的标志,以确保只调用一次reloadRootControllers调用。

static NSString* hasLaunchedIfNotNullString = NULL;

- (void)awakeWithContext:(id)context
{
    if(hasLaunchedIfNotNullString == NULL)
    {
        //START Code which gets executed once
        hasLaunchedIfNotNullString = @"";

        ...
        [WKInterfaceController reloadRootControllersWithNames:YOUR_ARRAY contexts:CONTEXTS];
        // END code which gets executed once
    }
}