Ios “基于页面”;重新加载名为“的RootControllers”;在发射回路上?

Ios “基于页面”;重新加载名为“的RootControllers”;在发射回路上?,ios,watchkit,apple-watch,Ios,Watchkit,Apple Watch,遵循苹果的指导方针 调用此方法重新加载应用程序基于页面的界面中的页面。在启动时,您可以使用此方法自定义要显示的页面集 在启动时,只会导致循环。每次重新加载调用awakeWithContext或将一次又一次地激活或初始化 是否有更好的方法在启动时重新加载基于页面的应用程序,并发生循环 这是WatchKit应用程序的常见问题,因为我们不再有UIApplicationLegate来处理此类设置。一个好的方法是按如下方式构造代码: MainInterfaceController(故事板中的主要链接指向

遵循苹果的指导方针

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

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


是否有更好的方法在启动时重新加载基于页面的应用程序,并发生循环

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

  • MainInterfaceController
    (故事板中的主要链接指向此处)
  • PageOneInterfaceController
    -在页面集中显示的第一个界面
  • PageTwoInterfaceController
    -页面集中的第二个界面
MainInterfaceController
实际上永远不会显示。根据
main interfacecontroller.awakeWithContent()
中配套iOS应用程序的缓存状态,您将始终启动到一组不同的接口控制器。通过这种方式,您可以使用
MainInterfaceController
,就像我们在iOS中使用
UIApplicationLegate
来设置窗口和根视图控制器一样

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

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

非常容易解决,而且不需要多个页面控制器——只需使用一次

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

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

这就是为什么
唤醒上下文:
存在的原因。第一次启动应用程序时,初始控制器将作为
context
传递
nil
。但是,如果您使用names:context:重新加载RootControllers,则有机会传递自定义上下文实例,从而区分启动模式。

调用WKInterfaceController.reloadRootControllers会导致第二次调用唤醒函数。这就是我使用的解决方案——它是直接的、紧凑的,并且消除了递归循环。本例中有两个基于页面的视图,分别称为mainControls和nowPlaying,它们是通过上下文配置的。注意,这里的关键是使用空字符串上下文配置mainControls视图控制器,然后检查该上下文,如果由于将上下文配置为“”的WKInterfaceController.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
    }
}

每次使用名称调用ReloadRootControllers时都会调用awakewithcontext,这就是为什么它会导致循环。只需在故事板中配置默认的页面导航是的,我在发布时错误地阅读了苹果的文档,认为它应该为你做所有的工作。哇,太棒了,这是一个聪明的训练,我正要使用一堆布尔值,我并不期待它。非常感谢!reloadRootControllersWithNames-这不会调用已存在的控制器上的deactivate。如果控制器上有可见的东西(如计时器)需要停止,有什么解决方案吗?@cnoon我一直在使用它从远程通知中显示正确的WKInterface控制器。最后,我调用了两次名为的
ReloadRootControllers
,一次是在我的
MainInterfaceController
awakeWithContext
中,一次是在
-(void)handleActionWithIdentifier:(NSString*)远程通知标识符:(NSDictionary*)远程通知
。然而,我在页面控件中首先看到三个点,然后变成两个点。有办法避免吗?我的方法正确吗?使用字符串字段作为标志通常是个坏主意。这是一个更简单更干净的方法,谢谢!这就是我如何实现我的!