2011-11-15 54 views
0

我正在製作一個顏色選擇器。我有以下代碼:如何阻止不必要地通過這兩種方式傳遞的值?

查看或者Controller.h:

@interface ColorPickerViewController : UIViewController <HueSliderDelegate> { 
    HueSlider *hueSlider; 
    float hue; 
} 
@property (nonatomic, assign) float hue; 

@end 

查看Controller.m或者:

-(void)setHue:(float)hueLocal { 
    hue = hueLocal; 
    hueSlider.hue = self.hue; 
} 

-(void)hueChanged { 
    self.hue = hueSlider.hue; 
} 

HueSlider.h:

@protocol HueSliderDelegate <NSObject> 

-(void)hueChanged; 

@end 

@interface HueSlider : UISlider { 
    HueSlider *hueSlider; 
    float hue; 
}  
@property (nonatomic, assign) float hue; 

@end 

HueSlider.m:

//the hue float can be set when the user moves the slider 
-(void)setHue:(float)hueLocal { 
    hue = hueLocal; 
    slider.value = self.hue; 
    [self.delegate hueChanged]; 
} 

問題是用戶更改了值,滑塊將更改發送到視圖控制器。視圖控制器然後改變它的色調值,該值將變化發回到滑塊。不需要將它發送回滑塊,並且如果用戶沿着滑塊移動,它將跳回原來的位置。有關如何以不同方式編碼以阻止這種情況的建議?

注意:它實際上並不是一個滑塊,但是我把問題放到了這個上下文中,因爲它不像描述我製作的自定義控件那麼複雜,它與滑塊類似。

+0

一旦通過代碼發生更改(而不是用戶操作),不從控件向視圖控制器發送hueChanged如何? – Till

+1

爲什麼不只是將ColorPickerViewController的色調基於滑塊設置的任何值並在您的ViewController的.h文件中跳過'float hue;'聲明? –

回答

2

添加一個額外的BOOL屬性來控制它。將該屬性添加到您的視圖控制器類;只要用戶開始來移動滑塊(可以在touchesBegan中執行此操作,或者其他任何方法實際移動滑塊),都可以翻轉該值。該屬性可以被稱爲什麼,但這個想法是:

BOOL userIsAdjustingValue; 

初始化它的類設置方法(INIT,viewDidLoad中)一個爲NO。當用戶觸摸/開始通過界面滑塊修改該值時,將其設置爲YES。你可以通過另一個委託方法實現這一點,或者,假設你的滑塊是一個子視圖,並且你的響應鏈是完整的,你可能直接用touchesBegan在控制器中觸發它,然後用touchesEnded再次關閉。

在控制器中添加一條if語句,用於更新滑塊值。如果userIsAdjusttingValue == YES,則不要允許控制器更新它。

當用戶完成對滑塊的操作後,將該值重新設置爲NO,並且您的控制器可以自由地操縱滑塊的值,因爲它認爲合適。

+1

好概念。您也可以傳遞一個布爾作爲委託方法的一部分。 – Moshe

+0

是的,實際上將它作爲委託方法的一部分傳遞,效率更高! – isaac

+0

偉大的解決方案。謝謝你。我可以做一些凌亂的工作,但希望它是可靠的代碼。這允許它是這樣的。 – Andrew

相關問題