我正在iOS中创建一个基于锻炼的应用程序。我要介绍的一个功能是收藏夹列表。就目前而言,我有一个练习库,您可以在其中点击一个按钮并将其添加到收藏夹列表中,该列表可通过导航 Controller 访问。我能够正确地将标题传递给商店,然后将其放置在“收藏夹”表 View 中。我可以根据表 View 单元格的标题加载特定的exerciseViewController
并在运行之间保存。但是,当我尝试删除练习时,我遇到了问题。我已经奋斗了几个小时。
这是场景:
我在收藏夹中添加了两个练习:第一行中的exercise A
和第二行中的exercise B
。但是,当访问收藏夹列表时,我选择exercise A
来查看其详细信息,然后决定不对其进行收藏,然后导航(返回)至收藏夹列表,该文件不会正确更新。尽管它正确加载了行数(现在为1),但仍显示exercise A
标题(应显示exercise B
标题)。但是,当我一直导航回到主页并选择“收藏夹”练习时,它可以正确显示-现在仅显示exercise B
标题。我尝试在[[self tableview] reload]
中调用viewWillAppear
(这似乎是最常见的答案),编写通知,协议(protocol)等,但仍然遇到此问题。似乎唯一可以正常工作的时间是通过主页访问收藏夹列表并调用viewDidLoad
时。
当表格出现且不必加载时,如何使表格正确显示?
收藏夹表 View
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;
}
最佳答案
您不会每次都创建新的单元格,这就是为什么最终要获取“错误的单元格”的原因。您使用的是reusablecells,它不会每次都在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;
}