- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
[WKInterfaceController reloadRootControllersWithNames:@[@"pageOne", @"pageTwo"] contexts:nil];
}
遵循Apple的指南
调用此方法重新加载应用基于页面的界面中的页面。在启动时,您可以使用此方法自定义要显示的页面集。
在发布时,只会导致循环。每次重新加载调用awakeWithContext或将一次又一次地激活或初始化。
是否有更好的方法可以在启动循环时重新加载基于页面的应用程序?
答案 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
}
}