以编程方式在UISegmentedControl中根据该段的标题选择一个段

时间:2013-05-23 20:16:44

标签: objective-c uisegmentedcontrol

我有一个UISegmentedControl有几个段,每个段都有不同的“标题”。我希望能够在NSString中读取,并以编程方式选择标题与该字符串匹配的段。假设我从以下内容开始:

NSString *stringToMatch = @"foo";
UISegmentedControl *seg = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"foo",@"bar",@"baz", nil]];

我想做类似的事情:

[seg selectSegmentWithTitle:stringToMatch];

但由于没有名为selectSegmentWithTitle的方法,这不起作用。有人知道一种与此类似的方法吗?


我还考虑过循环seg中的所有标题,类似于:

int i = 0;
for (UISegment *thisSeg in [seg allSegmentsInOrder])
{
    if ([thisSeg.title isEqualToString:stringToMatch])
    {
        [seg setSelectedSegmentIndex:i];
        break;
    }
    i++;
}

但据我所知,没有UISegment这样的东西,也没有方法allSegmentsInOrder。同样,有没有人知道我可以做些什么改变才能让它发挥作用?


第三,我可能会将UISegmentedControl子类化,以某种方式添加我想要的方法。我讨厌这样的子类化,因为我必须去重新声明我所有的段和其他不方便的事情。但这可能是唯一的出路...


也许这样做的方式与我上面列出的三个想法完全不同。我愿意接受任何事情。

1 个答案:

答案 0 :(得分:2)

所以当我输入这个问题时,我一直在搜索并意识到我的第二种方法来自OP非常接近。我想我仍然应该发布我想出的内容,以防其他人在将来寻找类似的东西。

for (int i = 0; i < [seg numberOfSegments]; i++)
{
    if ([[seg titleForSegmentAtIndex:i] isEqualToString:stringToMatch])
    {
        [seg setSelectedSegmentIndex:i];
        break;
    }
    //else {Do Nothing - these are not the droi, err, segment we are looking for}
}
if ([seg selectedSegmentIndex] == -1)
{
    NSLog(@"Error - segment with title %@ not found in seg",stringToMatch);
    NSLog(@"Go back and fix your code, you forgot something");
    // prob should do other stuff here to let the user know something went wrong
}

这仍然感觉有点hacky,并且可能在某个地方反对一些最佳实践指南,但如果有一个有限的标题列表,你可以确定stringToMatch将永远在该列表上,我在想它应该没事。