从 NSUserDefault 保存和检索数据时,保存按钮无法正常工作
Posted
技术标签:
【中文标题】从 NSUserDefault 保存和检索数据时,保存按钮无法正常工作【英文标题】:Save button not working properly when saving & retrieving data from NSUserDefault 【发布时间】:2017-03-08 07:12:05 【问题描述】:我对保存按钮的功能有疑问。
当我在UITableView
中使用少量(少于 10 个)数据(行)时,它可以完美运行。但是当我在UITableView
中的大量(超过 260 行)数据(行)上使用相同的功能并单击任何行索引中的保存按钮时,同时按下按钮将其显示为选中该行,但它也显示其他一些行为选择以及使用该特定按下按钮的行,
这是我的代码。
所以请让我知道我错在哪里?以及如何以正确的方式做到这一点?
在我定义的 .h 文件中
@property(nonatomic, strong) NSMutableArray *myFavorites;
在 .m 文件中,我首先在 viewDidLoad
中为 NSUserDefault
定义了以下代码
myFavorites = [NSMutableArray arrayWithArray:[[[NSUserDefaults standardUserDefaults] objectForKey:@"mutableArray"] mutableCopy]];
在tableView:cellForRowAtIndexPath
方法中,我定义了以下显示收藏按钮
UIButton *addtoFavsButton = [UIButton buttonWithType:UIButtonTypeCustom];
if([myFavorites containsObject:[NSNumber numberWithInt:(int)indexPath.row]])
[addtoFavsButton setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
else
[addtoFavsButton setImage:[UIImage imageNamed:@"like"] forState:UIControlStateNormal];
addtoFavsButton.selected=!addtoFavsButton.selected;
addtoFavsButton.frame = CGRectMake(370.0f, 0.0f, 50.0f, 45.0f);
[cell addSubview:addtoFavsButton];
[addtoFavsButton addTarget:self
action:@selector(addtoFavs:)
forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:addtoFavsButton];
[addtoFavsButton setTag:indexPath.row];
最后是最喜欢的按钮功能。
- (IBAction)addtoFavs: (id)sender
UIButton *addtoFavsButton = sender;
//NSLog(@"selected favourite button tag %li", (long)addtoFavsButton.tag);
NSNumber * mynumber = @(addtoFavsButton.tag);
// NSLog (@"number is %@", mynumber);
addtoFavsButton.selected=!addtoFavsButton.selected;
if (addtoFavsButton.selected)
[addtoFavsButton setImage:[UIImage imageNamed:@"like"] forState:UIControlStateNormal];
[myFavorites removeObject:mynumber];
else
[addtoFavsButton setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
if(myFavorites == nil)
myFavorites = [[NSMutableArray alloc] init];
[myFavorites addObject:mynumber];
else
[myFavorites addObject:mynumber];
//NSLog(@"My array: %@", myFavorites);
[[NSUserDefaults standardUserDefaults] setObject:myFavorites forKey:@"mutableArray"];
[[NSUserDefaults standardUserDefaults] synchronize];
// NSLog(@"Saved Array: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"mutableArray"]);
// addtoFavsButton.selected=!addtoFavsButton.selected;
所以请告诉我,当我在我的 tableview 中使用少量数据(例如少于 10 行)时,它工作得很好,但是当我过去输入大量数据(例如超过 260 行)并选择喜欢的按钮时,它也使用了随机选择多行最喜欢的按钮,当我过去取消选择第一个选择的按钮时,它也会继续显示我选择的图像,但会从 NSUserDefault 中删除对象。
请建议我哪里做错了。 . .
谢谢。
【问题讨论】:
看到这个***.com/questions/8556590/… 你能发布你的cellForRowAtIndexPath
方法代码吗?
@CodeChanger 是的,让我再次编辑我的问题。并放置 cellForRowAtIndexPath 的完整功能。
【参考方案1】:
您真的应该只使用自定义单元格类。这允许您分离 UI 和业务逻辑。
当单元格上的按钮被点击时,您可以使用该类进行中继,通过委托发送回消息。
FavoritesCellDelegate
: 由 UIViewController 实现的委托
@protocol FavoritesCellDelegate<NSObject>
- (void)favoritesCellButtonTapped:(FavoritesCell *)cell;
@end
FavoritesCell
: 在这里自定义 UI
- (IBAction)favButtonTapped:(UIButton *)favButton
if ([self.delegate respondsToSelector:@selector(favoritesCellButtonTapped:)])
[self.delegate favoritesCellButtonTapped:self];
UIViewController <FavoritesCellDelegate>
:处理更新用户默认值的 UIViewController
- (void)favoritesCellButtonTapped:(FavoritesCell *)cell
NSIndexPath *indexPath = [self.tableView indexPathforCell:cell];
// Get item from datasource using indexPath
// Update user defaults with value from cell for item
【讨论】:
自定义单元格类不是一个好的选择,因为我已经在使用标准单元格,而且我与该标准单元格相关的功能太多......所以我无法考虑此时自定义单元格类。 自定义单元格类当然是一个不错的选择,考虑到您正在以编程方式在cellForRow
中创建一个按钮,然后不受约束地添加它。您是否考虑过它可能无法在所有设备尺寸上看起来都正确?你也没有显示你是否在使用cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
【参考方案2】:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
你是这样设置的吗?重用。当你有 260 个电池时,如果电池不回收,就会消耗很多性能。同时,当您单击第一个单元格按钮时,可能会选择第三个按钮或其他按钮。
【讨论】:
建议自定义单元格更好。以上是关于从 NSUserDefault 保存和检索数据时,保存按钮无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
我可以根据另一个 NSUserDefault 值保存 NSUserDefault 值吗?