UISegmentedControl取消选择(使所有分段都不选中)

54

实际上标题包含了我的问题。 我有一个 UISegmentedControl,并且需要取消当前选定的标签。 我尝试过:

[menu setSelectedSegmentIndex:-1];

我将menu作为uisegmentedcontrol的UBOutlet,但是这给了我一个异常。有人有什么想法吗?谢谢。Peter


8
建议使用UISegmentedControlNoSegment代替-1,这并不是一个问题的来源,但以防万一。 - Vladimir
2010-02-05 11:10:16.799 Gazetapl[30839:20b] *** -[NSCFArray length]: 无法识别的选择器发送到实例 0x3d39ed0[会话开始于 2010-02-05 11:10:16 +0100。] 2010-02-05 11:10:16.800 Gazetapl[30839:20b] *** 终止应用程序,因为未捕获到异常 'NSInvalidArgumentException',原因:'*** -[NSCFArray length]: 无法识别的选择器发送到实例 0x3d39ed0' 2010-02-05 11:10:16.802 Gazetapl[30839:20b] 堆栈:( - dusker
8个回答

253

正确的方法是:

[menu setSelectedSegmentIndex:UISegmentedControlNoSegment];

编辑:

Swift 5:

menu.selectedSegmentIndex = UISegmentedControl.noSegment

11
我不明白为什么OP不选择这个答案! - Ali
1
@Ali并不是因为这个问题。他已经做得(大多数)正确。正如我所解释的那样,他的问题在其他地方。 - David Kanarek
@DavidKanarek,但这真的没有意义,这就是答案,我也遇到了同样的问题,我谷歌搜索了一下,这是第一个谷歌搜索结果,这就是答案,奇怪的是,在问题中我看不到任何其他代码或异常..! - user1453351

32

将 segmentedControl 的 .momentary = YES 设置会改变用户与 segmentedControl 交互的方式。如果您希望在页面加载时初始状态下没有选择任何内容,但在用户进行选择后,segmentedControl 表现出相同的行为,则需要类似以下设置:

Swift 4 解决方案:

 @IBOutlet weak var segmentedControl: UISegmentedControl!

 self.segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment

Swift 5.1:

 self.segmentedControl.selectedSegmentIndex = UISegmentedControl.noSegment

31

我猜你想在分段控制器中创建一个短暂的选择。

在界面构建器中将分段控制器设置为短暂模式,或者在代码中可以这样做:

menu.momentary = YES;

瞬时操作仍会在加载时选择一个段。此外,只有当您实际需要瞬时段控制时,才应使用Momentary,而不是仅仅为了强制不选择任何段。请使用UISegmentedControlNoSegment解决方案。 - Michael Peterson

8

我做了一个支持这种交互的类:

class UIDeselectableSegmentedControl: UISegmentedControl {

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        let previousSelectedSegmentIndex = self.selectedSegmentIndex

        super.touchesEnded(touches, with: event)

        if previousSelectedSegmentIndex == self.selectedSegmentIndex {

            self.selectedSegmentIndex = UISegmentedControl.noSegment
            let touch = touches.first!
            let touchLocation = touch.location(in: self)
            if bounds.contains(touchLocation) {
                self.sendActions(for: .valueChanged)
            }
        }
    }
}

这样的主要优势在于您只需要修改Storyboard/Xib/ViewCode正在使用的类别,就可以轻松地实现此目的。 ;]

7

swift 4

@IBOutlet weak var segmentControl: UISegmentedControl! {
    didSet {
        segmentControl.selectedSegmentIndex = UISegmentedControl.noSegment
    }
}

3
在Xcode 6的界面构建器中,现在可以这样做:
取消属性检查器中分段控制行为下的“已选”选项。

2
Swift解决方案: @IBOutlet weak var mySegmentedControl: UISegmentedControl!mySegmentedControl.selectedSegmentIndex = -1

-1
我猜测你在代码中某处调用了[myArray length]而不是正确的[myArray count]。NSArray使用count方法而不是length来获取其包含的项目数量。

3
你好,我不理解。这与UISegmentedControl有什么关系? - dusker
1
没有直接的提示,但根据您发布的异常,问题不在于 UISegementedControl。也许在处理更改所选段时,您访问了一个数组。 - David Kanarek
4
为什么会有人点踩?我的回答是唯一一个真正解决dusker遇到问题的答案。 - David Kanarek
2
OP问了错误的问题(可以从异常中清楚地看出),这是正确的答案。它完全解决了问题。 - oyalhi
2
这并没有回答如何完全不选任何选项的问题...下面的Swift选项应该是被接受的答案。 - csmith
显示剩余2条评论

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