2014-01-12 15 views
5

iOSでエクササイズベースのアプリを作成しています。私は、お気に入りのリストを含めることができます。現在のところ、私はあなたがボタンをタップしてナビゲーションコントローラを介してアクセスするお気に入りリストに追加するエクササイズライブラリを持っています。私は適切にタイトルを店に渡して、それをお気に入りテーブルビューに配置することができます。私はテーブルビューのセルのタイトルに基づいて特定のexerciseViewControllerをロードし、実行の間に保存することができます。しかし、私は演習を削除しようとすると問題が発生します。私は何時間も苦労してきました。UITableViewを正しく読み込む方法

これはシナリオである:

私は私のお気に入りへの2つの演習を追加しました:最初の行にあるexercise A、及びexercise B秒です。しかし、お気に入りリストにアクセスしたときに、その詳細を表示するにはexercise Aを選択し、それを非表示にして、お気に入りリストに戻って戻る(戻る)と、正しく更新されません。行数(現在は1)が正しくロードされていますが、それでもexercise Aタイトル(exercise Bタイトルが表示されます)が表示されます。しかし、ホームページに戻ってお気に入りの運動を選択すると、それは正しく表示されます - exercise Bというタイトルのみが表示されます。私は[[self tableview] reload]viewWillAppear(これは最も一般的な答えと思われる)、通知、プロトコルなどを書いてみましたが、まだこの問題を抱えています。それが正常に動作するように見える唯一の時間は、お気に入りリストにホームページからアクセスし、viewDidLoadが呼び出されたときです。

テーブルが表示され、ロードする必要がないときに、テーブルを正しく表示するにはどうすればよいですか?

お気に入りのテーブルビュー

FavsVC.m 
- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; 
    NSLog(@"APPEARING"); 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 
     NSArray *fav = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
     NSString *name = [fav objectAtIndex:indexPath.row]; 
     cell.textLabel.text = name; 
    } 
    return cell; 
} 

//This the method is in my store, and gets called when I click on an exercise to add or delete. 
- (id)addToFavorites:(NSString *)title 
{ 
    favoriteTitles = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
    if ([favoriteTitles containsObject:title]) { 
     NSLog(@"exercise removed"); 
     //[favoriteTitles removeObject:title]; 

     NSMutableArray *newArray = [NSMutableArray arrayWithArray:favoriteTitles]; 
     [newArray removeObject:title]; 
     [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:@"Favorites"]; //newArray 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } else { 
     NSLog(@"exercise added"); 
     //[favoriteTitles addObject:title]; 

     NSMutableArray *newArray = [NSMutableArray arrayWithArray:favoriteTitles]; 
     [newArray addObject:title]; 
     [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:@"Favorites"]; //newArray 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
    return self; 
} 

答えて

5

あなたは「間違った細胞を」フェッチ終わる理由です、新しい細胞に、毎回を作成しないでください。 cellForRowAtIndexPathで毎回作成されず、むしろ変更された再利用可能なセルを使用します。その理由は、UITableViewがメモリ目的で実際に画面上にあるセルのみを格納するためです。代わりにこれを使用してください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 

     if (!cell) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 
      // Only create a new cell if it's nil 
     } 
     // Now you have a reference to the cell. Set its variables. 
     NSArray *fav = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
     NSString *name = [fav objectAtIndex:indexPath.row]; 
     cell.textLabel.text = name; 
     return cell; 
    } 
+0

感謝を持っている場合、これは私の問題を解決し、ペン先からあなたの目を覚ましをチェックする必要があります。 – BradRS

+0

喜んで、正しい質問としてそれをフックしてください。 – Martol1ni

0

あなたのビューコントローラが表示されることを通知する必要がありますか?ちょうどUINavigationControllerDelegateを使用してください。

// Somewhere in a table view controller 
self.navigationController.delegate = self; 
// ------------------------------------------------------- 
- (void)navigationController:(UINavigationController *)navigationController  
     willShowViewController:(UIViewController *)viewController 
        animated:(BOOL)animated 
{ 
    // Your code to update the table view 
} 

UINavigationControllerDelegateに準拠するように、あなたのテーブルビューコントローラを設定することを忘れないでください。

もう1つのオプションは、お気に入りのビューコントローラで、関連するコンテンツが変更された後で、テーブルプロンプトの再読み込みをトリガーすることです。

しかし、私は個人的に最初のアプローチがもっと好きです。

0

私はまた、どのようにあなたがあなただけのデータ

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

     UITableViewCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 

//I would probably make a property for array... not create it here 
NSArray *fav = [[NSUserDefaults standardUserDefaults] objectForKey:@"Favorites"]; 
    if(fav){ 
     NSString *name = [fav objectAtIndex:indexPath.row]; 
    cell.textLabel.text = name; 
    } 
    return cell; 
} 

からテーブルをロードする必要がお使いの場合ではない文を必要としない問題がセルを引き起こしていない場合ステートメントは、すでにあなたをリフレッシュするために作られていると思いますあなたのお気に入りのビューを却下しますか?

はあなたのviewWillAppearです:メソッドが呼び出されていますか?

//ペン先をチェックし、デフォルトはYESことができますが、助けのための1つの

- (void)awakeFromNib { 

    [super awakeFromNib]; 

     self.clearsSelectionOnViewWillAppear = YES;  

} 
関連する問題