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

时间:2016-02-27 03:30:00

标签: ios objective-c uitableview cocoa-touch

我有一个包含用户帖子的表格视图,可以进行投票和投票。我有两个自定义按钮用于单元格中的upvote和downvote,我这样使用:

// 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];

    }

}

当"竖起大拇指"按钮被选中,用户改变主意并按下"拇指向下",如何取消选择"拇指向上"按钮在同一个单元格中?

3 个答案:

答案 0 :(得分:1)

你应该有一个包含"竖起/竖起"的模型。信息;你不应该以选择或不选择按钮的形式将它存储在你的视图中。

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

对于最简单的解决方案(具有最小的结构更改和代码),可以通过将按钮操作方法移动到自定义单元类来实现。然后在cellForRowAtIndexPath:

中添加动作以进行upvote和downvote
// 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中有一个用户upvote和downvote的数据。这只是这个特定情况的快速答案,但是为了支持dataModel更改,您可以在单元格中添加对模型的引用,并在此操作方法中修改它以节省投票。