2017-02-16 20 views
0

私のアプリはcoreDataベースでmapKitとスポットアノテーションを使用しています。アプリはすべての機能で動作します。主な問題は、このテキストフィールドに新しい場所を入力すると、この新しい場所がテーブルビューに表示されないように見えるということです。アプリを再起動したときにのみ、テーブルがリフレッシュされ、テーブルビューのリロード命令があるにもかかわらず、新しいスポットが使用可能になります。誰にもこれがどうして起こり、どのように修正できるのかという手掛かりはありますか? ありがとうございます。テーブルビューの コード:IOS/Objective-c: "real time"の問題がcoreDataに保存される

@interface TableViewController() 

@property (strong) NSMutableArray *lisbonSpots; 


@end 

@implementation TableTableViewController 

- (IBAction)delete:(UIBarButtonItem *)sender { 
    self.tableView.editing = !self.tableView.editing; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //_bar=[Spot spotType:@"bar"]; 


    self.tableView.dataSource = self; 

    _lisbonSpots = [[Spot allSpots]mutableCopy]; 
    NSLog(@"The Core Spots are: %@", _lisbonSpots); 

    [self.tableView reloadData]; 

} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 1; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    return 0; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return self.lisbonSpots.count; 

} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    NSManagedObject *ls = [self.lisbonSpots objectAtIndex:indexPath.row]; 
    NSLog(@"Table Spots are: %@", ls); 
    [cell.textLabel setText:[NSString stringWithFormat:@"%@", [ls valueForKey:@"name"]]]; 
    cell.imageView.image = [UIImage imageNamed:@"city.jpg"]; 
    return cell; 
} 
+0

は、メインスレッド上でtableview.reloadDataと呼ばれてい?? –

+0

私たちが手助けできるようにいくつかのコードを表示 –

+0

TableViewController(didLoad)にtableview.reloadDataがあります – FuManchu

答えて

1

reloadDataviewDidLoadと呼びます。私はアプリを再起動すると

のみ、テーブルが更新され、新たなスポットがテーブルビューのリロード

viewDidLoadは、初期セットアップ作業のために使用されるべき命令または「ワンタイム」を有するにもかかわらず、利用可能であるのみView Controllerを設定するときに機能します。アプリケーションの起動ごとに1回だけ呼び出される可能性が最も高いです。ビューコントローラのライフサイクルの詳細については、Looking to understand the iOS UIViewController lifecycleを参照してください。

このよう viewDidAppearにご reloadDataの呼び出しを移動してみてください:

- (void)viewDidAppear { 
    [super viewDidAppear]; 
    _lisbonSpots = [[Spot allSpots]mutableCopy]; 

    [self.tableView reloadData]; 
} 
+0

それは仕事をしなかった、問題は残っている...しかし、他の奇妙なことはピンが同じアプリケーションセッションでは、マップ上にピンが表示されますが、そのテーブルの名前ではないことです(説明していない)...申し訳ありません – FuManchu

+0

あなたの答えは正しいですが、1行が見つかりませんでした:_lisbonSpots = [[Spot allSpots] mutableCopy]; メソッドにはソースデータが含まれている必要があります。しかし、信用はあなたのものです、ありがとう:) – FuManchu

0

はNSFetchedResultscontrollerとデータをフェッチしてみてください:初期化で呼び出される単一のメソッド内のコードの後 、NSFetchedResultscontroller * fetchedControllerのインスタンス変数を作成します。

NSManagedObjectContext *context = <#Managed object context#>; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Configure the request's entity, and optionally its predicate. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[sortDescriptor release]; 

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] 
    initWithFetchRequest:fetchRequest 
    managedObjectContext:context 
    sectionNameKeyPath:nil 
    cacheName:@"<#Cache name#>"]; 
[fetchRequest release]; 

NSError *error; 
BOOL success = [controller performFetch:&error]; 

tableview Delegateメソッドの場合、fetchedResultsControllerは挿入または削除後にフェッチ処理を行います。コードはApple Docsから

希望します。

+0

答えがありがとうございますが、私はこのコントローラーを一度も使用していませんし、タイトなシェージーレです...解決策が必要です – FuManchu

+0

試してみてください。それは価値がある!それは見た目よりも簡単です。単にNSFetchedResultscontrollerの宣言をwindowDidLoadの後に呼び出される関数として実装してみましょう。残りは単純です。 – voltae

関連する問題