【问题标题】:How to get Apple Watch to update pages created with WKInterfaceController reloadRootControllersWithNames: contexts?如何让 Apple Watch 更新使用 WKInterfaceController reloadRootControllersWithNames 创建的页面:上下文?
【发布时间】:2015-09-02 01:13:01
【问题描述】:

我有一个用于 watchkit 应用的 WKInterfaceController,InterfaceController.m。它创建这样的分页内容:

- (void)willActivate {
    [super willActivate];
    NSDate *now = [[NSDate alloc] init];
    NSDictionary *time = @{@"time":[NSString stringWithFormat:@"%f",[now timeIntervalSince1970]]};
    NSArray *contexts = [[NSArray alloc] initWithObjects:time,time,nil];
    NSArray *names = [[NSArray alloc] initWithObjects:@"page",@"page",nil];
    [WKInterfaceController reloadRootControllersWithNames:names contexts:contexts];
}

以“page”为标识的WKInterfaceController称为PageInterfaceController.m,只显示InterfaceController.m发送的时间

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
    [label setText:[context objectForKey:@"time"]];
}

第一次加载时效果很好,但退出并重新启动应用程序后,它会显示旧时。如何让应用返回 InterfaceController.m 并更新时间?

是的,我知道我可以将时间放在 PageInterfaceController 中,但在我的实际应用程序中,InterfaceController 正在获取位置数据并将其发送到页面,甚至确定要创建的页面数量。

您可以在这里下载整个示例项目:

https://github.com/tomkincaid/WatchInterfaceTest

【问题讨论】:

    标签: ios watchkit apple-watch watch


    【解决方案1】:

    解决方法是使用计时器并使其在一定时间后返回到第一个接口控制器。不理想,因为我希望每次启动手表应用时都能从第一个界面控制器启动它。

    - (void)awakeWithContext:(id)context {
        [super awakeWithContext:context];
        time = [context objectForKey:@"time"];
    }
    
    - (void)willActivate {
        [super willActivate];
        NSDate *now = [[NSDate alloc] init];
        double diff = [now timeIntervalSince1970] - [time doubleValue];
        if (diff > 30) {
            NSArray *contexts = [[NSArray alloc] initWithObjects:@"",nil];
            NSArray *names = [[NSArray alloc] initWithObjects:@"main",nil];
            [WKInterfaceController reloadRootControllersWithNames:names contexts:contexts];
        } else {
            [label setText:[NSString stringWithFormat:@"%@",time]];
        }
    

    【讨论】:

      【解决方案2】:

      如果手表保持控制器加载,则不会再次调用awakeWithContext,这可能是它在初始加载后没有更新的原因。

      相反,在 PageInterfaceController 中使用 viewWillActivate,就像在主 InterfaceController 中一样,如下所示:

      - (void)viewWillActivate {
          [super viewWillActivate];
          [label setText:[context objectForKey:@"time"]];
      }
      

      【讨论】:

      • viewWillActivate 将简单地显示与以前相同的上下文。它需要回到初始的 InterfaceController 来获取新的位置数据。
      • 你的问题对这个问题太含糊了。如果问题是您无法让原始控制器更新数据,请停止尝试强制它完成这项工作。将一个类放在可以为两个控制器获取数据并使用它的上下文中。
      • 顺便说一句,我无法想象如果你要对最终不正确的答案投反对票,为什么会有人愿意冒险帮助你。大多数人只会对糟糕的答案投反对票,而不是对最终没有帮助的答案投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多