2011-11-29 2 views
4

뷰 계층을 바꿔서 여러 개의 WebView를 가지고 있습니다. 이러한 WebView 중 일부는 양식 필드를 포함하므로 editDelegate를 구현하여 내 문서의 NSUndoManager를 제공합니다.WebView의 NSUndoManager에 대한 실행 취소 작업 제거

WebView에서 입력을 수행하면 실행 취소 스택에있는 작업이 생성된다는 점이 문제입니다. 뷰가 계층 구조에서 제거 된 후에도 작업은 실행 취소 스택에 남아 있습니다. 이 시점에서 사용자가 Cmd-Z를 사용하여 "입력 취소"를하면 -undoEditing :이 (가) 할당 취소 된 WebEditorUndoTarget 인스턴스로 전송되므로 예외가 발생합니다. (WebKit 구현에 사용되는 개인 클래스)

대상을 참조 할 수 없어서 -removeAllActionsWithTarget :을 사용할 수 없습니다. 유일한 해결책은 WebView에 대한 등록 취소를 비활성화하는 것입니다.

내가 누락되었거나 WebView의 제한 사항입니까?

답변

1

하나의 비공개 API 솔루션은 [WebView _clearUndoRedoOperations]를 호출하는 것입니다. 공개 API 솔루션을 아직 찾지 못했습니다.

+0

WebView에 -close 메시지를 보내면 _clearUndoRedoOperations가 호출됩니다. 예외 역 추적 (backtrace)에서 _clearUndoRedoOperations 앞에 -_close가있는 것을 보았습니다. public 메소드가 똑같은 일을하는 것처럼 보입니다. – chockenberry

+0

잘 알고 있습니다. 감사! –

1

내 생각에 WebView는 WebView의 undoManager에서 자신이나 하위 서버 객체를 제거해야합니다.이 경우에는 귀하의 것입니다.

설명에 따르면이 작업을 수행하지 않습니다. 타겟을 찾아 명시 ​​적으로 제거 할 수 있도록 목표를 세우는 것이 효과가 없다고 생각합니다. 이전에 사용했던 또 다른 솔루션을 제안하고 싶습니다. 또는 사용에 대해 생각할만큼 충분히 길었습니다.)

이런 종류의 상황에 대한 생각은 NSUndoManager의 사용자 정의 하위 클래스를 사용하는 것입니다.이 하위 NSUndoManager는 registerUndoWithTarget : ... 및 prepareWithInvocationTarget을 재정 의하여 모든 자체 등록의 중복 메모리를 유지할 수 있습니다. 신뢰할 수있는 모든 등록 목록을 사용하면 언제든지 집 청소에 대한 자체 정책을 적용 할 수 있습니다. 나는. "대상의 클래스가 소유하지 않은 프레임 워크의 클래스 인 경우 제거하십시오."... 또는보다 구체적이고 WebEditorUndoTarget 클래스와 일치하는 것을 제거하려는 경우를 예로들 수 있습니다.

0

마지막으로 NSUndoManager을 검사 한 결과 - (void)removeAllActions이었습니다. 액션 타겟을 지정할 필요가 없습니다.