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

18

我有一个UISegmentedControl,其中包含两个部分(索引为0和1),我想通过编程的方式将它们重置为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的选定索引,获取适当的视觉反馈,并在一个方法中检查选定的索引,根据所选的索引做出相应的操作。请参见下面我的答案,了解解决方案。


在尝试选择之前,两个段是否都已启用?(使用isEnabledForSegmentAtIndex) - Nitin Alabur
@calvinBhai 我也这么认为,难道默认不是启用的吗? - OWolf
@NickThorne 是的,看起来应该是可以修复的。也就是说,要在程序中实现当视图被点击时发生的操作。如果我想出来了,我会在这里添加的。 - OWolf
@calvinBhai 谢谢。是的,没错。我弄清楚后会在这里发布。 - OWolf
我刚刚在下面发布了一个答案 - 我的问题与Interface Builder有关。 - Nick T
显示剩余2条评论
7个回答

30

viewDidLoad:中进行更改:

[seg setSelectedSegmentIndex:index];

您可以随意更改使用索引值。


2

Swift 3.0

segmentedControl.selectedSegmentIndex = #your value#

2
正确答案在此链接中的@arcady bob那个。 我已经发布了Swift 5的更新版本,这里引用一下:

yourSegmentedControl.selectedSegmentIndex = 0

yourSegmentedControl.sendActions(for: UIControl.Event.valueChanged)

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


2

从代码中,你可以这样做:seg.selectedSegmentIndex = someDefaultIndex

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


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]];
    }
}

0
重新陈述一下我想通过这个问题实现的目标:我想通过一个变量动态地设置UISegmentedControl的选定索引,获得适当的视觉反馈,并在方法中检查所选的索引,根据所选的索引执行某些操作。
最初,我猜想这很简单:mySegmentedController.selectedSegmentIndex = someIndex,然后测试索引。但正如我在问题中所述,它对我不起作用。行为很奇怪。运行该代码后,适当的按钮不会突出显示。
这是一个我已经修复它的项目,所以它可以工作。不确定为什么它能工作。可能是我在设置索引之前放置的延迟。如果我能完善它,我将更新和注释项目文件。

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


0

警告:这并不完全回答问题,但与之密切相关。

我遇到了类似的问题。大多数情况下,我的UISegmentedController都能正常工作。它有4个分段,关闭、30、60和120。

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

解决方法是从我的XIB中删除该UISegmentedController,并用一个新的(完全相同的)替换它,然后它就可以正常工作了。

我甚至将有问题的UISegmentedController复制到另一个应用程序的XIB中。关闭分段(即索引0处的分段)在该XIB中也无法选择。

这似乎是XCode的问题。


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