UISegmentedControl deselect (make none of the segments selected)

IphoneXcodeUisegmentedcontrolIboutlet

Iphone Problem Overview


in fact the title contains my question. I have a UISegmentedControl, and need to deselect currently selected tab. I tried:

[menu setSelectedSegmentIndex:-1];

menu being the UBOutlet for uisegmentedcontrol but this gives me exception. anyone have some idea? thanks peter

Iphone Solutions


Solution 1 - Iphone

The right way to do this is:

[menu setSelectedSegmentIndex:UISegmentedControlNoSegment];

Edit:

Swift 5:

menu.selectedSegmentIndex = UISegmentedControl.noSegment

Solution 2 - Iphone

Setting the segmentedControl to .momentary = YES changes the way the user can interact with the segmentedControl. If you want to have nothing selected initially when the page loads but have segmentedControl behave the same after a selection is made by the user then you will want something more like this:

Swift 4 solution:

 @IBOutlet weak var segmentedControl: UISegmentedControl!

 self.segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment

Swift 5.1:

 self.segmentedControl.selectedSegmentIndex = UISegmentedControl.noSegment

Solution 3 - Iphone

I guess you try to create a momentary selection in segmented control. In interface builder set the segmentedcontrol to momentary. Or in code you can do:

menu.momentary = YES;

Solution 4 - Iphone

swift 4

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

Solution 5 - Iphone

I did class which supports this kind of interaction:

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)
            }
        }
    }
}

The main advantage of that is that you just need to modify which class the Storyboard/Xib/ViewCode is using and this will work like a charm ;]

Solution 6 - Iphone

You can now do this in xcode 6 in the interface builder:

Deselect the 'Selected' option under segmented control behaviour in attributes inspector.

Solution 7 - Iphone

The Swift solution: @IBOutlet weak var mySegmentedControl: UISegmentedControl! and mySegmentedControl.selectedSegmentIndex = -1.

Solution 8 - Iphone

I would assume that you've called [myArray length] instead of the proper [myArray count] somewhere in your code. NSArray uses the count method, not length for the number of items it contains.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionduskerView Question on Stackoverflow
Solution 1 - IphoneCalin DruleView Answer on Stackoverflow
Solution 2 - IphoneDan LeonardView Answer on Stackoverflow
Solution 3 - IphonedombeszView Answer on Stackoverflow
Solution 4 - IphoneKerim KhasbulatovView Answer on Stackoverflow
Solution 5 - IphoneRodolfoAntoniciView Answer on Stackoverflow
Solution 6 - IphoneZaxterView Answer on Stackoverflow
Solution 7 - IphoneTom DanielView Answer on Stackoverflow
Solution 8 - IphoneDavid KanarekView Answer on Stackoverflow