1

現在、ユーザーが hh:mm:ss 形式で選択している値を表示するために、それぞれのラベルを継続的に更新する一連の 5 つの UISliders があります。各スライダーのプロパティを連続に設定し、スライダーが変更されたときにターゲットを設定します (この例は最初のスライダーのみです)。

    sliderOne.continuous=YES;
    [sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventTouchUpInside];

各スライダーの個々のラベルは、選択された時間を完全に更新します。ただし、これらすべてのスライダーの下にある別のラベルを更新して、スライダーの値を継続的に合計する必要があります。

同時に、2 つのセグメント化されたコントローラー (マイル/キロメートルのセグメント化されたコントローラーと別のセグメント化されたコントローラーのさまざまな距離) を使用して、スライダーの値でいくつかの変換も行っています。各変換の結果は秒単位の時間になり、hh:mm:ss 形式に変換され、ユーザーがセグメント コントローラーから必要なコンボを選択すると、最後のラベルに表示されます。これについてすべての計算を行ったところ、セグメントを変更するとラベルは正しく更新されますが、継続的に更新されるわけではありません。

ユーザーが UISlider を変更すると、すべての UISlider の合計を継続的に表示するようにラベルを更新するにはどうすればよいですか?

4

3 に答える 3

6

継続的に更新するには、プロパティUIControlEventValueChangedとともにイベントを使用しますcontinuous

    sliderOne.continuous=YES;
    [sliderOne addTarget:self action:@selector(sliderOneChanged:) forControlEvents:UIControlEventValueChanged];
于 2013-08-07T17:43:20.133 に答える
1

KVO を使用して UISliders の変更の通知を受け取り、それに応じて UI を更新します。dispatch_asyncインターフェイスのロックを回避するために、UI の更新を でラップします。

KVO-Notification-Managerを使用すると、次のようになります (viewDidLoadまたは同様の):

id token1 = [slider1 addKVOBlockForKeyPath:@"value" options:NSKeyValueObservingOptionNew handler:^(NSString *keyPath, id object, NSDictionary *change) {
    dispatch_async(dispatch_get_main_queue(), ^{
        whateverSliderNeedsUpdate.value = /* your calculation result */;
    });
}];
id token2 = [slider2 /* repeat for as many sliders as you want */];
...

ある時点でオブザーバーを削除することが重要です。

- (void)dealloc {
    [slider1 removeKVOBlockForToken:token1];
    [slider2 ...];
}

冒険好きならReactiveCocoaを試すことができます。

于 2013-08-07T17:45:41.220 に答える