信息未在 viewDidLoad 上发送到 Apple Watch

Posted

技术标签:

【中文标题】信息未在 viewDidLoad 上发送到 Apple Watch【英文标题】:Information not sending over to Apple Watch on viewDidLoad 【发布时间】:2016-03-28 03:51:59 【问题描述】:

我有一个带有 watchOS 扩展的 ios 应用程序,这两个应用程序都是用 Objective-C 构建的。应用程序在加载 (viewDidLoad) 或出现 (viewDidAppear:(BOOL)animated) 时需要通过数组发送。当应用程序加载时,什么也没有发生,但如果我以某种方式将文件添加到应用程序(通过内置加法器或从我的桌面或 AirDrop 导入文件),手表应用程序会更新。按刷新按钮不会使应用程序工作。但是,一旦我添加了一个文件,它就会很好地更新并开始完美更新。我不确定为什么会发生这种情况,但这是我使用的一些代码。我删掉了一些不太有用的代码。

viewDidLoad:

- (void)viewDidLoad

NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *appFolderPath = [path objectAtIndex:0];
NSString *inboxAppFolderPath = [appFolderPath stringByAppendingString:@"/Inbox"]; //changes the directory address to make it for the inbox

//move all files from inbox to documents root
//get to inbox directory
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSArray *inboxContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[NSString stringWithFormat:inboxAppFolderPath,documentsDirectory] error:nil];

//move all the files over
for (int i = 0; i != [inboxContents count]; i++)

    NSString *oldPath = [NSString stringWithFormat:@"%@/%@", inboxAppFolderPath, [inboxContents objectAtIndex:i]];
    //NSLog(oldPath);
    NSString *newPath = [NSString stringWithFormat:@"%@/%@", appFolderPath, [inboxContents objectAtIndex:i]];
    //NSLog(newPath);
    NSError* error;
    [[NSFileManager defaultManager] moveItemAtPath:oldPath toPath:newPath error:&error];
    NSLog(@"error: %@", error.localizedDescription);

//end of moving all files



//Turn every file inside the directory into an array
//add directory in case it doesn't already exist
if (![[NSFileManager defaultManager] fileExistsAtPath: inboxAppFolderPath])

    [[NSFileManager defaultManager] createDirectoryAtPath: inboxAppFolderPath withIntermediateDirectories:NO attributes:nil error:nil];
    NSLog(@"directory created");




//a bunch of NSPredicates go here to filter out the array


[self sendStuffToWatch];

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

[self connectToWatch];

-(void)connectToWatch,有

-(void)connectToWatch

//set up WatchConnectivity session
if([WCSession isSupported])

    self.watchSession = [WCSession defaultSession];
    self.watchSession.delegate = self;
    [self.watchSession activateSession];


    if([WCSession defaultSession].paired)
        NSLog(@"Watch session active");
    
    else
    
        NSLog(@"WATCH NOT CONNECTED");
    


-(void)sendStuffToWatch

-(void)sendStuffToWatch

if(self.watchSession)

    NSError *error;
    NSDictionary *applicationDict = @@"array":recipes;
    [self.watchSession updateApplicationContext:applicationDict error:&error];
    NSLog(@"sent info to watch");


-(void)viewDidAppear:(BOOL)animated,只有这个

-(void)viewDidAppear:(BOOL)animated

[self sendStuffToWatch];

刷新按钮的代码是

-(IBAction)Refresh:(id)sender

[recipeTable reloadData];
[self sendStuffToWatch];
[self viewDidLoad];

【问题讨论】:

【参考方案1】:

你的方法都乱了套。你想先调用 super,然后设置连接,过滤数组,最后将数据发送到手表。

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

[self connectToWatch];

// rest of code here to create recipe array

[self sendStuffToWatch];

另外,您不应该在自己的代码中调用viewDidLoad。当视图控制器第一次加载到内存中时,它应该只为您调用一次,而不是由您调用。

如果您有要重新运行的代码,请将其从 viewDidLoad 移出到它自己的方法中,然后调用该方法。

【讨论】:

另外,如果你想强制view加载和viewDidLoad被调用,你可以调用loadViewIfNeeded 不幸的是,它没有用,但是对于在刷新按钮中调用 viewDidLoad,我需要重新加载所有内容,我应该从 viewDidLoad 获取 /everything/ 并将其全部粘贴进入他们自己的方法? 是的(除了调用 super)。至于它不起作用,您应该能够使用调试器,单步执行您的代码,并确保没有发生错误。由于它最初不起作用,但在您添加文件时起作用,因此在第一次运行时没有设置或准备好某些东西。您只需要找出导致问题的部分即可。

以上是关于信息未在 viewDidLoad 上发送到 Apple Watch的主要内容,如果未能解决你的问题,请参考以下文章

来自 Flutter App 的 Firebase Id Token 未在 REST 服务器上验证

nib 文件未在 viewDidLoad 中注册

IBAction 方法未在 viewDidLoad 方法中调用?

Swift iOS SearchController 未在 ViewDidLoad 中调用

Spring Boot flash 属性未在 Azure 上发送

Spring 未在响应时发送 CSRF 令牌