2011-11-15 5 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]; 
} 

사용자가 값을 변경하면 슬라이더가 변경 사항을 View Controller에 보냅니다. 뷰 컨트롤러는 색조의 값을 변경하여 변경 사항을 다시 슬라이더로 보냅니다. 슬라이더로 되돌려 보내지 않아도되며 사용자가 슬라이더를 따라 움직이면 다시 원래 위치로 돌아갑니다. 이 문제를 어떻게 막을 수 있는지에 대한 조언이 있습니까?

참고 : 실제로 슬라이더는 아니지만 슬라이더와 비슷한 사용자 지정 컨트롤을 설명하는 것보다 덜 복잡하기 때문에이 문맥에이 문제를 적용합니다.

+0

변경 사항이 코드를 통해 발생하면 (예 : 사용자 작업과 반대되는 방식으로) hueChanged를 컨트롤에서보기 컨트롤러로 다시 보내지 않으시겠습니까? – Till

+1

슬라이더가 설정된 값에 ColorPickerViewController의 색조를 설정하고 ViewController의 .h 파일에서'float hue;'선언을 건너 뛰지 않는 이유는 무엇입니까? –

답변

2

이를 제어하려면 추가 BOOL 속성을 추가하십시오. 보기 컨트롤러 클래스에 속성을 추가하십시오. 사용자 으로 시작하면 슬라이더를 움직일 수 있습니다 (touchesBegan 또는 실제로 슬라이더를 움직이는 모든 방법에서이 작업을 수행 할 수 있음). 이 호텔은 아무것도이라고하지만, 생각은 할 수 :

BOOL userIsAdjustingValue; 

는 클래스 설정 방법 (초기화,있는 viewDidLoad) 중 하나에 no로를 초기화합니다. 사용자가 인터페이스 슬라이더를 사용하여 값을 터치하거나 값을 수정하기 시작하면 YES로 설정하십시오. 다른 위임 메서드를 통해이 작업을 수행 할 수 있습니다. 슬라이더가 하위 뷰이고 응답 체인이 손상되지 않았다고 가정하면 컨트롤러에서 touchesBegan으로 직접 트리거 한 다음 touchesEnded로 다시 트리거 할 수 있습니다.

컨트롤러에서 슬라이더 값을 업데이트하는 호출을 둘러싼 if 문을 추가하십시오. userIsAdjusttingValue == YES 인 경우 컨트롤러가 업데이트하도록 허용하지 않습니다.

슬라이더를 조작 한 사용자는 값을 다시 NO로 설정하고 조절기는 자유롭게 슬라이더 값을 조작 할 수 있습니다.

+1

좋은 개념. bool을 위임 메서드의 일부로 전달할 수도 있습니다. – Moshe

+0

그래, 실제로 대리자 메서드의 일부로 전달하는 것이 더 효율적입니다! – isaac

+0

그레이트 솔루션. 고마워요. 지저분한 일을 할 수 있었지만 견고한 코드가되기를 원했습니다. 이것은 그렇게 할 수 있습니다. – Andrew

관련 문제