18

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

4

7 回答 7

30

在某一方面的变化viewDidLoad:

[seg setSelectedSegmentIndex:index];

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

于 2013-01-24T07:08:03.460 回答
2

从代码中,您只需执行seg.selectedSegmentIndex = someDefaultIndex.

是否应该设置它viewDidLoad:完全取决于应用程序的结构。例如,如果您的应用程序正在启动并首次加载视图,并且需要将控件设置为它在应用程序上一次运行期间所具有的任何值,那么在此处执行此操作绝对是有意义的。

于 2013-01-24T06:08:21.167 回答
2

斯威夫特 3.0

segmentedControl.selectedSegmentIndex = #your value#
于 2017-08-19T09:26:52.060 回答
2

正确答案是此链接上的@arcady bob one 。我已经发布了Swift 5 的更新版本,我在这里引用:

yourSegmentedControl.selectedSegmentIndex = 0

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

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

于 2020-01-15T16:46:40.763 回答
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]];
    }
}
于 2013-01-24T08:27:44.970 回答
0

重申我试图通过这个问题完成的任务:我想通过变量动态设置 UISegmentedControl 的选定索引,获取适当的视觉反馈,并在方法中检查选定的索引,以根据选定的索引发生一些事情。

本来我猜这个就这么简单:mySegmentedController.selectedSegmentIndex = someIndex,然后测试索引。但正如我的问题所述,它对我不起作用。行为很奇怪。运行该代码后,相应的按钮不会突出显示。

这是一个我确实修复它的项目,所以它可以工作。不确定它为什么起作用。可能是我在设置索引之前放在那里的延迟。如果可以改进,我将更新并评论项目文件。

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

于 2013-01-25T07:25:24.907 回答
0

警告:这不是完全回答问题,而是密切相关。

我有一个类似的问题。大多数时候我的 UISegmentedController 工作得很好。它有 4 个段,关闭、30、60 和 120。

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

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

我什至 CMD-C 和 CMD-V 将有问题的 UISegmentedController 放入另一个 App 的 XIB 中。并且 Off 段(即索引 0 处的段)在该 XIB 中也是不可选择的。

这似乎是 XCode 的一个问题。

于 2013-01-25T19:41:30.517 回答