保存按钮时保存按钮不能正常工作从NSUserDefault

时间:2017-03-08 07:12:06

标签: ios objective-c uitableview uibutton nsuserdefaults

我发布了保存按钮的功能。

当我在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中删除对象。

请建议我在哪里做错了。 。 。

感谢。

2 个答案:

答案 0 :(得分:0)

您应该只使用自定义单元格类。这允许您分离UI和业务逻辑。

您可以使用该类在单元格上点击按钮时进行中继,然后通过代理发回消息。

FavoritesCellDelegate:代表由UIViewController实现

@protocol FavoritesCellDelegate<NSObject>
- (void)favoritesCellButtonTapped:(FavoritesCell *)cell;
@end

FavoritesCell:在此处自定义用户界面

- (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
}

答案 1 :(得分:0)

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
你有这样的设置吗?重用。当你有260个单元格时,如果单元格不能回收,那么它将具有很高的性能。同时,当您单击第一个单元格按钮时,可能会选择第三个按钮或其他按钮。