我正在iOS中创建一个基于练习的应用程序。我想要包含的是我最喜欢的列表。按照目前的情况,我有一个练习库,您可以点击一个按钮并将其添加到通过导航控制器访问的收藏夹列表中。我能够正确地将标题传递到商店,然后将其放在收藏夹表视图中。我可以根据表格视图单元格的标题加载特定的exerciseViewController
并在运行之间保存。但是,当我尝试删除练习时,我遇到了问题。我一直在苦苦挣扎几个小时。
这是一个场景:
我在我的收藏夹中添加了两个练习:exercise A
位于第一行,exercise B
位于第二行。但是,当访问收藏夹列表时,我选择exercise A
来查看其详细信息,并决定不相信它,然后返回(返回)收藏夹列表,它没有正确更新。虽然它正确加载了行数(现在为1),但它仍显示exercise A
标题(它应显示exercise B
标题)。但是当我一直导航回主页并选择收藏夹练习时,它会正确显示 - 现在只显示exercise B
标题。我曾尝试在[[self tableview] reload]
中调用viewWillAppear
(这似乎是最常见的答案),编写通知,协议等,但仍然遇到此问题。它似乎正常工作的唯一时间是通过主页访问收藏夹列表并调用viewDidLoad
。
如何在表格出现且无需加载时正确显示表格?
收藏夹tableview
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;
}
答案 0 :(得分:5)
您不会每次都创建新单元格,这就是您最终获取“错误单元格”的原因。您使用的是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;
}
答案 1 :(得分: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
。
另一个选项是在对相关内容进行一些更改后触发重新加载表提示,在您的收藏夹视图控制器中。
但我个人更喜欢第一种方法,因为你在这里有松耦合。
答案 2 :(得分:0)
我认为问题是if not语句导致已经刷新的单元格你不需要你的if语句你只需要从数据中加载表格
-(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,但是如果你有一个
,请从nib检查你的清醒 - (void)awakeFromNib {
[super awakeFromNib];
self.clearsSelectionOnViewWillAppear = YES;
}