从 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 &lt;FavoritesCellDelegate&gt;:处理更新用户默认值的 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 值保存 NSUserDefault 值吗?

NSUserDefault 无法在 iOS8 的扩展中保存和加载

如何在 NSUserDefault 中保存我的数据类型?

NSUserDefault的使用

NSUserDefault 有时不会保存自己