UISegmentedControl:如何检测当前分段的点击?

10

有没有办法检测UISegmentedControl中段的第二次点击?我找到了:

侦测段的第二次点击

但是,里面说道:

如果您将分段控件设置为瞬态样式,则当用户触摸它时,段不会显示为选定状态(蓝色背景)。披露按钮始终是瞬态的,并且不影响实际选择。

是否有办法检测第二次点击,并触发选择操作并将段显示为选定状态?

如果没有直接的方法来实现,我的想法是,我首先将momentary标志设置为YES,然后在每次点击时,手动更新选择状态,但随后我还需要更新/取消其他段。

谢谢

2个回答

16
解决方案是创建一个自定义的 UISegmentedControl 子类,并像以下这样自行检查。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    current = self.selectedSegmentIndex;
    [super touchesBegan:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];

    if (current == self.selectedSegmentIndex)
        [self sendActionsForControlEvents:UIControlEventValueChanged];
}

我曾经有一个解决方案,全部写在touchesBegan方法里,但在iOS 7中它不再起作用了。在Stack Overflow上还有其他的解决方案,在iOS 6及更高版本也都不能工作。


1
我尝试过的大部分解决方案都会触发两次选择事件,在iOS 7上运行得非常完美。你是最棒的,谢谢! - Thiago Peres

1
无法使特定的段可再次点击,但您可以使用UISegmentedControlNoSegment重置整个segmentControl。
[self.segmentCtrlOutlet setSelectedSegmentIndex:UISegmentedControlNoSegment];

你需要做的是将上述代码放在点击UISegmentedControl特定段时执行该代码的位置。
例如,在我的项目中,当我点击某个段时,UIPopoverController打开,里面有UIPicker,所以我在UIPicker委托方法“didSelectRow”中使用上述代码。

这不就相当于使控件短暂吗?我认为这并没有解决问题,因为OP想要检测已经选定的片段上的单击。https://developer.apple.com/documentation/uikit/uisegmentedcontrol/1618586-ismomentary - Michael Peterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接