2009-11-17 3 views
3

나는 사용자가 편집 할 데이터가 들어있는 NSTextView을 가지고 있지만 편집 할 수없는 데이터의 머리글과 꼬리말로 둘러싸여있어서 사용자에게 컨텍스트에 대한 아이디어를 제공하려고합니다.NSTextView는 편집 할 수없는 텍스트 영역입니까?

NSTextView은 편집 가능한 혼합 데이터/편집 불가능 데이터의 개념을 처리 할 수 ​​없다고 생각합니다. 그래서 몇 가지 아이디어를 생각해 냈습니다.

a) 머리글과 바닥 글을 그리기 위해 사용자 지정 셀과 함께 텍스트 첨부를 사용하십시오.

b) NSScrollView 내에 3 NSTextView을가집니다.

c) 속성을 사용하여 편집 할 수없는 것을 결정하고, 위임 방법을 사용하여 편집을 막으십시오. 아마도 이것은 가장 방해가되지 않으므로 아마도 가장 좋아하는 방법 일 것입니다.

더 좋은 아이디어가 있습니까?

답변

7

NSTextView 대리자 메서드 -textView:shouldChangeTextInRange:replacementString:을 사용하면이 작업을 수행 할 수 있습니다. 변경하려면 "그냥 안된다고"할 수 있습니다. ;-)

업데이트/정교화 (11 월 2015)

은이 답변에 의견에 따라 정교하게는, 아이디어는 사용자 정의가 attributed string 텍스트 뷰 속성을 사용하는 것입니다 편집이다. standard attributes 너머에 고유 한 속성 이름 (모든 NSString)과 PLIST-compatible object을 해당 이름의 값으로 지정할 수 있습니다. 당신이 "편집 할"로 텍스트의 범위를 지정하려는 경우 예를 들어

, 당신 YES 또는 NOBOOL 값을 갖는 NSNumber과 (예를 들어)라는 이름의 속성 @"TextIsEditableAttributeName"와 그 범위에 대한 add an attribute 수 : [NSNumber NO] 또는 @(NO) (동일한 결과 : ObjC 번호 권투를 사용하려면 NSNumber 인스턴스). 나중에 텍스트보기에서 대리인에게 범위 내의 텍스트를 변경해야하는지 묻는 경우 @"TextIsEditableAttributeName" 특성의 범위를 검사 할 수 있습니다.

실제로 이 편집 가능한 이 아닌 범위에 속성을 지정해야하므로 값을 확인하지 않아도됩니다. 자리 표시 자에 대해 빈 NSData 인스턴스를 두어 속성에 값이있을 수 있습니다. 속성 이름은 @"EditingLocked" 또는 무언가 일 수 있습니다. 즉, 존재 여부@"EditingLocked" 속성 어디서나 제안 된 범위에 있고 텍스트보기가 묻는 경우 NO을 반환하는지 확인해야한다는 것을 의미합니다. 이렇게하면 편집 가능한 범위와 편집 할 수없는 범위의 중첩 선택 (편집 할 수없는 텍스트 복사 선택을 허용 한 경우)이 발생합니다.

-textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:에 대해 동일한 접근 방식을 사용할 수 있습니다. 의 "corrected"배열을 반환 할 수있는 또 다른 대리자 메서드을 선택할 수 있습니다. 편집 할 수없는 텍스트를 선택하지 않으려면 제안 범위에서 찾을 수있는 @"EditingLocked" 속성의 모든 인스턴스에서 설명하는 범위를 "잘라낼"수 있습니다.

이 정보가 도움이되기를 바랍니다.

+0

바닥 글의 '범위'는 사용자가 수정 한 내용에 따라 변경 될 수 있으므로 사용자 지정 속성을 사용하여 추적 할 수 있다고 생각합니다. 나는 이것이 지금까지 가장 좋은 접근법처럼 들리는 것 같아요. 의견을 주셔서 감사합니다. –

+0

그것은 커스텀 속성의 중요한 부분입니다. :-) –

+0

은 범위 변경과 같이 텍스트를 추적하기 위해 사용자 지정 속성을 할당하는 방법을 공유 할 수 있습니다. – Ekra