【问题标题】:Deselect a button in a table view cell when another is tapped当点击另一个按钮时,取消选择表格视图单元格中的按钮
【发布时间】:2016-02-27 03:30:00
【问题描述】:

我有一个表格视图,其中包含可以赞成和反对的用户帖子。我有两个自定义按钮用于单元格中的赞成和反对票,我这样使用:

// in cellForRowAtIndexPath:
[cell.upVote addTarget:self action:@selector(handleThumbsUp:) forControlEvents:UIControlEventTouchUpInside];
[cell.downVote addTarget:self action:@selector(handleThumbsDown:) forControlEvents:UIControlEventTouchUpInside];

//the methods

- (IBAction)handleThumbsUp:(ThumbsUpButton *)sender {

    if (sender.selected == YES) {

        [sender setSelected:NO];

    } else {

        [sender setSelected:YES];

    }

}

- (IBAction)handleThumbsDown:(ThumbsDownButton *)sender {

    if (sender.selected == YES) {

        [sender setSelected:NO];

    } else {

        [sender setSelected:YES];

    }

}

When the "Thumbs Up" button is selected, and the user changes his mind and presses "Thumbs Down", how can I deselect the "Thumbs Up" button in that same cell?

【问题讨论】:

    标签: ios objective-c uitableview cocoa-touch


    【解决方案1】:

    您应该有一个包含“拇指向上/向下”信息的模型;您不应该以是否选择按钮的形式将其存储在您的视图中。

    当点击其中一个按钮时,您的控制器应更新模型并根据模型的状态刷新视图。

    (某种绑定系统会使这更容易:ReactiveCocoa 就是这样一个选项(尽管它不仅仅是模型/视图绑定);另一个更简单(无耻链接到我自己的免费代码)是我自己的UIViewController+WSSDataBindings category.)

    【讨论】:

      【解决方案2】:

      通过@selector,您可以访问按钮的属性,而不是按钮处理程序方法中单元格的另一个控件。

      因此,您必须在按钮处理方法上更新整个单元格,并在表的cellForRowAtIndexpath 委托方法中手动处理按钮的选定状态。

      【讨论】:

        【解决方案3】:

        对于最简单的解决方案(结构更改和代码最少),可以通过将按钮操作方法移动到您的自定义单元格类来实现。然后在cellForRowAtIndexPath:中添加支持和反对的操作

        // in cellForRowAtIndexPath:
        [cell.upVote addTarget:cell action:@selector(handleThumbsUp:) forControlEvents:UIControlEventTouchUpInside];
        [cell.downVote addTarget:cell action:@selector(handleThumbsDown:) forControlEvents:UIControlEventTouchUpInside];
        

        或者您可以直接从 Nib 文件中设置此方法。

        然后像这样更改upvote / downvote方法。

        //the methods
        
        - (IBAction)handleThumbsUp:(ThumbsUpButton *)sender {
        
            if (sender.selected == YES) {//upvote undone
        
                [sender setSelected:NO];
        
            } else {//upvote done
        
                [self.upVote setSelected:YES];
                [self.downVote setSelected:NO];//delesect downvote
            }
        
        }
        
        - (IBAction)handleThumbsDown:(ThumbsDownButton *)sender {
        
            if (sender.selected == YES) {//downVote undone
        
                [sender setSelected:NO];
        
            } else {
        
                [self.downVote setSelected:YES];
                [self.upVote setSelected:NO];//deselect upvote
        
            }
        
        }
        

        也正如 Josh Caswell 在他的回答中所说,您应该在填充单元格的 dataModel 中有用户赞成和反对的数据。这只是针对这种特定情况的快速回答,但要支持 dataModel 更改,您可以在单元格中添加对模型的引用,并在此操作方法中对其进行修改以保存投票。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-20
          • 2020-10-21
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多