当点击另一个按钮时,取消选择表格视图单元格中的按钮

Posted

技术标签:

【中文标题】当点击另一个按钮时,取消选择表格视图单元格中的按钮【英文标题】: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?

【问题讨论】:

【参考方案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 更改,您可以在单元格中添加对模型的引用,并在此操作方法中对其进行修改以保存投票。

【讨论】:

以上是关于当点击另一个按钮时,取消选择表格视图单元格中的按钮的主要内容,如果未能解决你的问题,请参考以下文章

Obj-C - 点击自定义表格视图单元格中的删除表格视图行按钮

点击保存按钮并存储在字典中时获取表格视图单元格中的文本字段?

在表格视图中点击按钮 - 错误的单元格

从另一个视图控制器中取消选择按钮

swift 3 在tableView 中按下了哪个单元格按钮

如何使表格视图单元格中的按钮工作[重复]