我正在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;
    }

10-05 20:06