web-dev-qa-db-ja.com

選択したUISegmentedControlのインデックスまたは値をプログラムで変更する

プログラムで0にリセットしようとしている2つのセグメント(インデックス:0と1)を持つUISegmentedControlがあります。以下のコマンドを実行すると、期待どおりにセグメントインデックスが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の選択されたインデックスを動的に設定し、適切な視覚的フィードバックを得て、メソッドで選択されたインデックスを確認します。選択したインデックスに応じて何かを起こします。解決策については、以下の私の答えを参照してください。

17
Mrwolfy

viewDidLoad:の変化

[seg setSelectedSegmentIndex:index];

必要に応じてインデックス値を使用して変更します。

28
Krishnan8190

コードから、seg.selectedSegmentIndex = someDefaultIndexを実行できます。

viewDidLoad:で設定する必要があるかどうかは、アプリケーションの構造に完全に依存します。たとえば、アプリが初めて起動してビューを読み込むときに、コントロールを前回のアプリの実行中に持っていた値に設定する必要がある場合、そこで実行することは間違いありません。

1
NewStack

これは、ビジュアルフィードバックの観点から、選択されたセグメントを並べ替えるのに役立ちます。つまり、選択されたセグメントをプログラムで設定した後、セグメントに適切な色合いが付けられます。

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]];
    }
}
1
Mrwolfy

Swift 3.

segmentedControl.selectedSegmentIndex = #your value#
1
Abhishek Jain

この質問で達成しようとしていたことを言い換えると、UISegmentedControlの選択されたインデックスを変数を介して動的に設定し、適切な視覚的フィードバックを得て、メソッドで選択されたインデックスをチェックして、選択されたインデックスに応じて何かが発生するようにします。

もともと私はこれが次のように単純であると推測しました:mySegmentedController.selectedSegmentIndex = someIndex次に、インデックスをテストします。しかし、私の質問で述べたように、それは私のために働いていませんでした。動作は奇妙です。そのコードを実行した後、適切なボタンが強調表示されません。

これは私が修正したプロジェクトなので、うまくいきます。なぜそれが機能するのか正確にはわかりません。インデックスを設定する前に、おそらくそこに入れた遅延。改善できる場合は、プロジェクトファイルを更新してコメントします。

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

0
Mrwolfy

警告:これは質問に完全に答えるものではありませんが、密接に関連しています。

同様の問題がありました。ほとんどの場合、UISegmentedControllerは問題なく動作しました。オフ、30、60、120の4つのセグメントがあります。

ランダムな間隔で(通常はリリース直前です!!)、オフセグメントはユーザーインターフェイスから選択できなくなります。 (コードからそれを選択しようとはしませんでした。それは、私がする必要があることではなく、問題を解決しないからです。)

解決策は、UISegmentedControllerをXIBから削除し、それを新しい(まったく同じ)ものに置き換えることです。

私はCMD-CとCMD-Vで問題のあるUISegmentedControllerを別のアプリのXIBに追加しました。また、そのXIBでもオフセグメント(インデックス0のセグメント)は選択できませんでした。

これはXCodeの問題のようです。

0
Nick T

正解は、この link の@arcady bobです。私は 更新されたバージョン Swift 5をここに引用します:

yourSegmentedControl.selectedSegmentIndex = 0

yourSegmentedControl.sendActions(for:UIControlEvents.valueChanged)

最初の行だけを使用する場合、セグメント化されたものはグラフィカルに反応しますが、セグメント化されたコントロールに関連付けられたIBActionは呼び出されません。いくつかの言葉で:2行目は、セグメント化されたコントロールをタップするようなものです。これが私が必要としていたもので、私が欠けていたものです。

0
novecento88