【问题标题】:Change Button state after selection on Table View在表格视图上选择后更改按钮状态
【发布时间】:2014-08-10 17:25:22
【问题描述】:

我有一个应用程序,用户可以在其中喜欢和不喜欢我的表格视图中的不同项目。每个表格视图单元格都有一个类似按钮,单击该按钮时会执行类似操作,该操作通过增加我保存的字典中的类似计数来记录。然后,用户可以再次单击该按钮并与该行不同,从而减少点赞计数。当点赞按钮被点击时,会调用如下方法:

- (void)next:(UIButton *)button

现在我正在使用[button setAlpha:0.1];(更改不透明度)来表示是否喜欢它。 这是我的问题:由于某种原因,另一个表格视图单元格受到影响/更改,除了目标单元格!因此,例如,如果我调用此方法并单击第 1 行,还会影响第 4 行。

喜欢和不喜欢在这里调用:

- (void)likeToObject:(BOOL)liked object:(PFObject*)object {
    PFQuery *query = [PFQuery queryWithClassName:@"Item"];
    [query whereKey:@"objectId" equalTo:[object objectId]];
    [query getFirstObjectInBackgroundWithBlock:^(PFObject *foundObject, NSError *error) {
        if (!error) {
            if (liked) {
                int currentLikes = [foundObject[@"likes"] intValue];
                [foundObject setObject:[NSNumber numberWithInt:currentLikes+1] forKey:@"likes"];
                [foundObject saveInBackground];
                [self loadObjects];
                [self.tableView reloadData];
            } else {
                int currentLikes = [foundObject[@"likes"] intValue];
                [foundObject setObject:[NSNumber numberWithInt:currentLikes-1] forKey:@"likes"];
                [foundObject saveInBackground];
                [self loadObjects];
                [self.tableView reloadData];
            }
        } else {
            [self.tableView reloadData];
        }
    }];
}

感谢您的帮助!

编辑:这是我的 UI/表格视图代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"ParseProduct";
    PFProductTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    if (!cell) {
        cell = [[PFProductTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    PFObject *product = self.objects[indexPath.row];
    [cell configureProduct:product];
    [cell.orderButton addTarget:self action:@selector(next:) forControlEvents:UIControlEventTouchUpInside];
    cell.orderButton.tag = indexPath.row;
    [cell.buyButton addTarget:self action:@selector(buy:) forControlEvents:UIControlEventTouchUpInside];
    cell.buyButton.tag = indexPath.row;
    [cell.shareButton addTarget:self action:@selector(share:) forControlEvents:UIControlEventTouchUpInside];
    cell.shareButton.tag = indexPath.row;
    return cell;
}

- (void)next:(UIButton *)button {
    PFObject *object = [self.objects objectAtIndex:button.tag];
    if (![[likesDict objectForKey:object.objectId] boolValue]) {
        [likesDict setObject:@YES forKey:object.objectId];
        [self likeToObject:YES object:object];
    } else {
        [likesDict setObject:@NO forKey:object.objectId];
        [self likeToObject:NO object:object];
    }
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    [likesDict writeToFile:[documentsDirectory stringByAppendingPathComponent:@"likes.plist"] atomically:YES];
    [button setAlpha:0.1];
}

- (void)configureProduct:(PFObject *)product {
    UIImage *backgroundImage = [UIImage imageNamed:@"Screen Shot 2014-06-16 at 6.34.53 PM.png"];
    UIEdgeInsets backgroundInsets = UIEdgeInsetsMake(backgroundImage.size.height/2.0f, backgroundImage.size.width/2.0f, backgroundImage.size.height/2.0f, backgroundImage.size.width/2.0f);
    UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[backgroundImage resizableImageWithCapInsets:backgroundInsets]];
    self.backgroundView = backgroundImageView;
    self.imageView.file = (PFFile *)product[@"image"];
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.imageView loadInBackground];
    self.priceLabel.text = [NSString stringWithFormat:@"$%d", [product[@"price"] intValue]];
    self.likeNumberLabel.text = [NSString stringWithFormat:@"%d",[product[@"likes"] intValue]];
    self.textLabel.text = product[@"name"];
    self.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:17.0f];
    self.textLabel.textColor = [UIColor colorWithRed:82.0f/255.0f green:87.0f/255.0f blue:90.0f/255.0f alpha:1.0f];
    self.textLabel.shadowColor = [UIColor colorWithWhite:1.0f alpha:0.7f];
    self.textLabel.shadowOffset = CGSizeMake(0.0f, 0.5f);
    self.textLabel.backgroundColor = [UIColor clearColor];
    self.textLabel.numberOfLines = 2;
    if ([product[@"hasSize"] boolValue]) {
        self.sizeButton = [UIButton buttonWithType:UIButtonTypeCustom];
        self.sizeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        [self.sizeButton setTitle:NSLocalizedString(@"Select Size", @"Select Size") forState:UIControlStateNormal];
        [self.sizeButton setTitleColor:[UIColor colorWithRed:95.0f/255.0f green:95.0f/255.0f blue:95.0f/255.0f alpha:1.0f] forState:UIControlStateNormal];
        [self.sizeButton setTitleEdgeInsets:UIEdgeInsetsMake(0.0f, 16.0f, 0.0f, 0.0f)];
        self.sizeButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:16.0f];
        [self.sizeButton setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal];
        self.sizeButton.titleLabel.textColor = [UIColor colorWithRed:95.0f/255.0f green:95.0f/255.0f blue:90.0f/255.0f alpha:1.0f];
        self.sizeButton.titleLabel.shadowOffset = CGSizeMake(0.0f, 0.5f);
        UIImage *sizeImage = [UIImage imageNamed:@"DropdownButton.png"];
        UIImage *sizePressedImage = [UIImage imageNamed:@"DropdownButtonPressed.png"];
        UIEdgeInsets insets = UIEdgeInsetsMake(sizeImage.size.height/2, sizeImage.size.width/2, sizeImage.size.height/2, sizeImage.size.width/2);
        [self.sizeButton setBackgroundImage:[sizeImage resizableImageWithCapInsets:insets] forState:UIControlStateNormal];
        [self.sizeButton setBackgroundImage:[sizePressedImage resizableImageWithCapInsets:insets] forState:UIControlStateHighlighted];
        UIImage *arrowImage = [UIImage imageNamed:@"Arrow.png"];
        UIImageView *arrowView = [[UIImageView alloc] initWithImage:arrowImage];
        arrowView.frame = CGRectMake(140.0f, (40.0f - arrowImage.size.height)/2.0f, arrowImage.size.width, arrowImage.size.height);
        [self.sizeButton addSubview:arrowView];
        [self addSubview:self.sizeButton];

    }
}

【问题讨论】:

    标签: ios uitableview ios7 uibutton


    【解决方案1】:

    这段代码应该这样做

    - (void)next:(UIButton *)button {
    NSLog(@"nextButton");
    
    PFQuery *query = [PFQuery queryWithClassName:@"Item"];
    PFObject *object = [self.objects objectAtIndex:button.tag];
    
    [query whereKey:@"objectId" equalTo:[object objectId]];
    
    if ([[likesDict objectForKey:object.objectId] boolValue] == NO) {
        [likesDict setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%@",object.objectId]];
        [button setTitle:@"unlike" forState:UIControlStateNormal];
        [self likeToObject:YES object:object];
    } else if ([[likesDict objectForKey:object.objectId] boolValue] == YES) {
        [likesDict setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%@",object.objectId]];
        [button setTitle:@"like" forState:UIControlStateNormal];
        [self likeToObject:NO object:object];
    }
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    [likesDict writeToFile:[documentsDirectory stringByAppendingPathComponent:@"likes.plist"] atomically:YES];
    

    }

    【讨论】:

    • 我看不出更改按钮标题是如何工作的,他强调的问题是其他表格视图单元格受到不同单元格上的操作的影响。编辑:也嗨 Eytan!
    【解决方案2】:

    我花了一些时间编辑您的问题以清理代码和英语。我还发现您正在初始化orderButton 和表格视图初始化中的其他按钮。每个按钮都应该是您的表格视图单元格的新创建实例!将您的按钮分配给新初始化的UIButton 实例,并设置您的视图属性,所有这些都在cellForRowAtIndexPath: 中。原因是,当您更改按钮的不透明度时,该按钮被分配给多个表格视图单元格,因此其他单元格也会发生变化。第四个表格视图单元格发生变化的原因(我可能是错的)可能是您必须滚动到那个单元格,因此它正在使用该不透明度集重新加载视图。

    此外,我认为将这些设置写入字典并通过 plist 将其保存在文件系统中是一种非常糟糕的设计。我要做的是子类PFObject 并拥有自己的自定义类,该类存储像isLiked 这样的布尔属性,这样该值就直接存储到指针中,当您从中检索对象时,您可以评估以下操作/步骤数组并计算 isLiked(然后您可以更改)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2012-08-17
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多