23

データがCoreDataから取得されたTableviewを備えたiPhone用のアプリがあります。

ここに画像の説明を入力

同じデータがウォッチ アプリにも表示されます。

ここに画像の説明を入力

iPhone アプリから行を追加すると、次のようになります。

ここに画像の説明を入力

Watch アプリでデータをリロードします。

ここに画像の説明を入力

古い行が空です。

ここに画像の説明を入力

時計アプリを停止して再度起動すると、すべてが正しく表示されます!

ここに画像の説明を入力

これは、時計アプリで Tableview を埋めるためのコードです

-(void)awakeWithContext:(id)context{
    [super awakeWithContext:context];
       [self loadTable];
}

-(void)loadTable{
    NSLog(@"loadTableData");
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Data"];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Data"
        inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortByDate = [[NSSortDescriptor alloc] initWithKey:@"sortedDateAndTime" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByDate, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    self.watchMArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

  //  [self.watchTableView setRowTypes:self.watchMArray];
    [self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"];

    for (NSInteger i = 0; i < self.watchMArray.count; i++)
    {
        WatchTableCell *cell = [self.watchTableView rowControllerAtIndex:i];
        NSManagedObject *data = [self.watchMArray objectAtIndex:i];
        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
            //Background Thread
            UIImage *foto =[self loadImageFromData:[data valueForKey:@"imageData"]];
            dispatch_async(dispatch_get_main_queue(), ^(void){
                //Run UI Updates
            [cell.watchImage setImage:foto];
            [cell.watchDate setText:[NSString stringWithFormat:@"%@", [data valueForKey:@"dataEOra"] ]];
            });
        });
    }
}

これは、現在リロードするために使用しているコードです。

- (IBAction)reloadTable {        
    [self loadTable];
}

どこが間違っていますか?

4

6 に答える 6

11

@leolobato が投稿したリンクには、実際に回避策があります。それは私の問題を解決しました。

https://devforums.apple.com/message/1098875#1098875

行を変更するときは、最初に =@"" に設定してください。

たとえば、行に row.Label があり、それを変更する場合は、row.Label.text = @"" を実行してから、row.Label.text =@"[実際のテキスト]" の直後に再度実行します。

于 2015-02-26T05:58:47.487 に答える
1

データをリロードするには、IBAction を次のように変更します。

- (IBAction)reloadTable {
    [self.watchTableView setNumberOfRows:self.watchMArray.count withRowType:@"data"];
}

WKInterfaceTableに関する Apple の開発者向けドキュメントから:

このメソッドは、既存の行をテーブルから削除し、numberOfRows および rowType パラメータの情報に基づいて新しい行セットを構成します。

setNumberOfRows:withRowType:元のコードで使用していることを考えると、ここでそれを使用しました。この方法setRowTypes:でも同様の効果が得られます。

于 2015-01-20T20:47:36.413 に答える
1

watchOS 5.1、iOS 12.1 では、setNumberOfRows:withRowType:indidAppearメソッドを追加した場合にのみ機能しました。awake(withContext:)orを使用してもwillActivateうまくいきませんでした。最初の 4 行は空白でした。

于 2018-11-08T19:36:21.563 に答える