我有一个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子类化,以某种方式添加我想要的方法。我讨厌这样的子类化,因为我必须去重新声明我所有的段和其他不方便的事情。但这可能是唯一的出路...
也许这样做的方式与我上面列出的三个想法完全不同。我愿意接受任何事情。
答案 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
将永远在该列表上,我在想它应该没事。