1

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。繰り返しますが、これを機能させるために私が加えることができる変更を知っている人はいますか?


第 3 に、おそらく UISegmentedControl をサブクラス化して、必要なメソッドを何らかの方法で追加できます。ただし、そのようなサブクラス化は嫌いです。すべてのセグメントやその他の不便なことを行って再宣言する必要があるからです。でもそれしか方法がないのかもしれません…


おそらく、これを行う方法は、上に挙げた 3 つのアイデアとはまったく異なります。私は何に対してもオープンです。

4

1 に答える 1

2

そのため、この質問を入力している間、検索を続け、OP からの 2 番目の方法がかなり近いことに気付きました。他の誰かが将来このようなものを探している場合に備えて、思いついたものを投稿する必要があると考えました.

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
}

これはまだ少しハッキリしているように感じられ、おそらくどこかのベスト プラクティス ガイドに反していますが、タイトルのリストが有限であり、stringToMatch常にそのリストにあると確信できる場合は、それで問題ないと思います.

于 2013-05-23T20:16:44.397 に答える