2011-05-06 5 views
3

바인딩을 통해 두 값을 처리하는 사용자 지정 NSView를 구성합니다. 나는 Tom Dalling이 질문 [Can you manually implement Cocoa bindings?]에 요약 한 바와 같이 업데이트시 값을 전파하고 있습니다. 이 모든 것이 잘 작동합니다.적절한 실행 취소 관리를 사용하여 지속적으로 업데이트되는 사용자 지정 컨트롤 만들기

컨트롤을 지속적으로 업데이트하기 위해 -mouseDragged 메서드의 값을 업데이트하고 전파합니다. 다시 말하지만,이 잘 작동하지만 NSUndoManager 중간 단계를 등록합니다. 나는 원하지 않습니다. 그래서 을 -mouseDown에 입력 한 다음 enableUndoRegistrationmouseUp에 입력 해 보았습니다. 자연스럽게 결과를 업데이트하고 전파합니다.

아니오 등록 된 모든에서 취소, 나는 값이 변경되지 않은 경우 내 설정 기능이 실행 취소를 등록하지 않기 때문에 그것의 실현 다음 -mouseDragged 이미 값을 전파 한 이후

- (void)setX:(double)newX { 
    if (newX != x) { 
     [[undoManager prepareWithInvocationTarget:self] setX:x]; 
     [self willChangeValueForKey:@"x"]; 
     x = newX; 
     [self didChangeValueForKey:@"x"]; 
    } 
} 

, 그것은 'didn를 -mouseUp으로 다시 전송되었을 때 변경되지 않으므로 실행 취소가 기록되지 않았습니다. 물론 원래의 위치 인 -mouseDown 이전에 되돌리기를 원합니다. 따라서 새로운 값을 보내기 전에 해당 값을 컨트롤에 저장하고 -mouseUp에 다시 전송하면됩니다. 물론 이것은 여전히 ​​이전의 가치로 돌아가는 것을 볼 수있는 문제가 있습니다.

실행 취소 관리자가 사용 설정되어 있는지 확인하고 이전 값을 추적하여 확인할 수 있습니다. -setX: 방법으로 해결할 수 있습니다. 그러나 NSSlider를 연속으로 설정 한 것과 같은 정확한 동작을 가진 컨트롤이 있으므로 컨트롤 내에서이 작업을 수행 할 수 있어야합니다.

감사합니다.

답변

2
+0

이 완벽하게 작동합니다 : 당신은 코코아 클래스가 내부적으로 어떻게 작동하는지 궁금하다면, 때때로 그누 스텝의 implementions (NSUndoManager는 그누 스텝 자료이며, NSSliderCell 같은 AppKit의 클래스 그누 스텝 GUI에있는)를 확인하는 것이 도움이 될 수 있습니다 . 나는 근본적으로 뭔가를 놓친다는 것을 믿을 수 없다. 나는 NSUndoManager와 관련하여 완전한 초보자이다. 감사! –