我有一个带有两个段(索引: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的选定索引,获得适当的视觉反馈,并检查所选索引方法,根据所选索引使某些事情发生。请参阅下面的答案以获得解决方案。
答案 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的一个问题。