2013-08-07 115 views
1

我目前有一系列5個UISliders,它們不斷更新各自的標籤以顯示用戶以hh:mm:ss格式選擇的值。我將每個滑塊的屬性設置爲連續,並且在更改滑塊時將其目標設置爲(此示例僅適用於第一個滑塊)。基於UISlider值連續更新標籤

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

每個滑塊的單獨標籤更新完全選定的時間。然而,現在我需要更新所有這些滑塊下面的另一個標籤,它們不斷總結滑塊的價值。

與此同時,我還使用兩個分段控制器 - 一英里/公里分段控制器和另一個分段控制器中的各種距離進行滑塊值的一些轉換。每次轉換都會產生一個秒數,然後轉換回hh:mm:ss格式,並在用戶從段控制器中選擇他們想要的組合時顯示在最後一個標籤中。我已經爲此完成了所有的數學計算,並且標籤在更改細分時會正確更新,但不是連續的。

如何更新標籤以隨着用戶更改而連續顯示每個UISlider的總和?

回答

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

+0

看着它,這似乎是最好的解決方案,因爲我必須做一些計算。儘管我並不完全理解KVO。 – nniroclax

0

你可以創建一個方法來完成你所有的數學計算,並用結果更新你的UILabel。例如:

- (void)updateSumLabel { 
    // this is obviously very simple 
    float num1 = [_sliderOne value]; 
    float num2 = [_sliderTwo value]; 
    float sum = num1 + num2; 

    [_sumLabel setText:[NSString stringWithFormat:@"@f",sum]]; 
} 

您可以從任何現有方法(如sliderOneChanged)調用updateSumLabel。這可能是最簡單的方法。

4

對於連續更新,使用UIControlEventValueChanged事件與continuous財產

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