以编程方式更改UISegmentedControl选定的索引或值

时间:2013-01-24 05:35:43

标签: ios xcode uisegmentedcontrol

我有一个带有两个段(索引:0和1)的UISegmentedControl,我试图以编程方式重置为0.当我运行下面的命令时,它不会按预期将段索引重置为0。相反,它突出显示段索引1.

    [seg setSelectedSegmentIndex:0];

奇怪的是,当我记录所选片段时,它会返回0

    NSLog(@"seg setSelectedSegmentIndex %d", seg.selectedSegmentIndex); 

另外奇怪的是,在运行setSelectedSegmentIndex:0后我无法通过触摸手动重新选择段0,它似乎被锁定到段1,直到我点击1,其中它正常工作。

以下是按钮的设置:

    itemArray = [NSMutableArray arrayWithObjects: @"Zero", @"One", nil];
    seg = [[UISegmentedControl alloc] initWithItems:itemArray];
    [seg setFrame:segRect];
    seg.segmentedControlStyle = UISegmentedControlStyleBar;
    seg.momentary = NO;
    [seg addTarget:self action:@selector(someAction:) forControlEvents: UIControlEventValueChanged];
    [mainView addSubview:seg];

注意:用这个问题来重述我想要完成的事情:我想动态地通过变量设置UISegmentedControl的选定索引,获得适当的视觉反馈,并检查所选索引方法,根据所选索引使某些事情发生。请参阅下面的答案以获得解决方案。

7 个答案:

答案 0 :(得分:28)

viewDidLoad:

的变化
[seg setSelectedSegmentIndex:index];

您可以根据需要更改索引值。

答案 1 :(得分:1)

从代码中,您可以seg.selectedSegmentIndex = someDefaultIndex

是否应在viewDidLoad:中设置它完全取决于应用程序的结构。例如,如果你的应用程序第一次启动并加载视图,并且需要将控件设置为上次运行应用程序时的值,那么在那里执行它肯定是有意义的。

答案 2 :(得分:1)

这有助于根据视觉反馈对所选片段进行排序,即在以编程方式设置所选片段之后,这将正确地对片段进行着色。

for (int i=0; i<[seg.subviews count]; i++)
{

    if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[seg.subviews objectAtIndex:i]isSelected])
    {
        [[seg.subviews objectAtIndex:i] setTintColor:[UIColor grayColor]];
    }
    if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[seg.subviews objectAtIndex:i] isSelected])
    {
        [[seg.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]];
    }
}

答案 3 :(得分:1)

Swift 3.0

segmentedControl.selectedSegmentIndex = #your value#

答案 4 :(得分:1)

正确的答案是此link处的@arcady bob 1。 我为Swift 5发布了updated version,在这里引用:

yourSegmentedControl.selectedSegmentIndex = 0

yourSegmentedControl.sendActions(用于:UIControl.Event.valueChanged)

如果仅使用第一行,则分段将以图形方式做出相应的反应,但不会调用与分段控件关联的IBAction。简而言之:第二行就像点击分段控件。这就是我所需要的,我所缺少的。

答案 5 :(得分:0)

用这个问题来重述我想要完成的事情:我想动态地通过变量设置UISegmentedControl的选定索引,获得适当的视觉反馈,并检查方法中的选定索引,以便根据选定的指数。

最初我猜测这很简单:mySegmentedController.selectedSegmentIndex = someIndex,然后测试索引。但正如我的问题所述,它不适合我。这种行为很奇怪。运行该代码后,相应的按钮不会突出显示。

这是我修复它的项目,所以它有效。不确定它为什么有效。在设置索引之前,我可能会放入一个延迟。如果我可以改进它,我将更新和评论项目文件。

http://owolf.net/uploads/StackOverflow/SegmentedControllers.zip

答案 6 :(得分:0)

警告:这并没有完全回答这个问题,但是密切相关。

我有类似的问题。大多数时候我的UISegmentedController工作正常。它有4个部分,Off,30,60和120.

以随机间隔(通常在发布之前!!),Off段从用户界面变为不可选择。 (我没有尝试从代码中选择它,因为这不是我需要做的,也无法解决我的问题。)

解决方案是从我的XIB中删除该UISegmentedController并将其替换为新的(并且完全相同),然后正常工作。

我甚至将CMD-C和CMD-V的违规UISegmentedController转换为另一个应用程序的XIB。 Off段(即索引0处的段)在该XIB中也是不可选择的。

这似乎是XCode的一个问题。