我该如何在程序中切换UISegmentedControl?

82

我如何以编程方式切换 UISegmentedControl

7个回答

109

或者,在您更改了selectedSegmentIndex之后,调用“sendActionsForControlEvents:”

segmentedControl.selectedSegmentIndex = 0

[segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];

SWIFT 5:

segmentedControl.selectedSegmentIndex = 0
segmentedControl.sendActions(for: .valueChanged)

13
如果没有使用sendActionsForControlEvents,它只会改变分段控制器的选项卡但不会触发事件。在Swift中,使用segmentedControl.sendActionsForControlEvents(UIControlEvents.ValueChanged)。谢谢。 - Stephen
工作正常,但旧索引颜色没有改变。 - Anil

100

selectedSegmentIndex属性可用于标识所选的UISegmentedControl段。将此属性设置为任何有效的段索引或UISegmentedControlNoSegment(-1)以关闭当前选择。

// select the first segment
segmented.selectedSegmentIndex = 0;

// turn off the current selection
segmented.selectedSegmentIndex = UISegmentedControlNoSegment;

40
然而,这实际上不会触发用户选择不同部分时设置的任何目标/操作。 - jmstone617
@jmstone617 我不会期望这样,就像使用 UISwitch 一样 - 至少在我的经验中,从 User Defaults 设置它的值并不会自动调用任何函数,如果用户手动更改其状态,则会调用该函数。 - user5306470
要触发您想要的操作,请在之后编写:segmentedControl.sendActions(for: .valueChanged) - Luchi Parejo Alcazar

29

在Swift中:

segmentedControl.selectedSegmentIndex = 1

快捷 2:

segmentedControl.sendActionsForControlEvents(UIControlEvents.ValueChanged)

Swift 3:

segmentedControl.sendActions(for: UIControlEvents.valueChanged)

25

@jmstone回应,确实,这个操作不会触发此控件的valueChanged事件。

克服这个问题的一种方法是自己调用函数:

segmentedControl.selectedSegmentIndex = 3;
[self valueChangedMethod:segmentedControl];

这将调用:
- (void)valueChangedMethod:(UISegmentedControl *)segmentedControl
{
    //continue your code here...
}

7

编辑:正如Yogesh Nikam Patil提醒我注意到的那样,UIControlEvents已从UIControlEvents更名为UIControl.Event。我已经相应地更新了我的代码。

@arcady bob的答案对我很有帮助。

我只是发布了一个SWIFT 5的更新版本:

yourSegmentedControl.selectedSegmentIndex = 0
yourSegmentedControl.sendActions(for: UIControl.Event.valueChanged)

如果你只使用第一行,分段控件将根据图形进行相应的反应,但是与分段控件相关联的IBAction不会被调用。简单来说:第二行就像点击分段控件一样。这就是我需要的,也是我所缺少的。

1
'UIControlEvents'已更名为'UIControl.Event'。 - Yogesh Nikam Patil

3

我曾遇到过类似的问题,即分段控件未能改变。

我之前调用了“selectedSegmentIndex”等方法,但时间点过早。一旦在“viewDidLoad”调用后再次调用它们,一切都恢复正常了。


3
首先,从您添加到用户界面的分段控件中创建一个outlet。
@IBOutlet weak var segmentedControl: UISegmentedControl!
使用以下代码以编程方式更改所选段:
segmentedControl.selectedSegmentIndex = 1 // 索引

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