2010-04-22 2 views
1

내 응용 프로그램에서 NSTableView를 ArrayController (arrangedObjects)에 바인딩했습니다. 또한 같은 컨트롤러 (선택)에 바인딩 된 세부 정보보기 (일부 텍스트 필드)가 있습니다.Cocoa-Binding : 변경 사항을 수동으로 제출 하시겠습니까?

이제 텍스트 필드를 편집 할 때마다 변경 사항이 자동으로 ArrayController에 보내지고 테이블도 변경됩니다. 어떻게 이것을 피할 수 있습니까? 내가 원하는 것은 "Submit-Button"입니다. 데이터를 변경하면 버튼을 누르면 컨트롤러로 보내야하며 편집을 할 때마다 자동으로 변경되지는 않습니다.

답변

2

이 질문에 대한 답변은 두 가지입니다. 첫 번째는 철학적입니다. 대부분의 경우 모델에 대한 업데이트를 즉시 수행해야합니다. 대부분의 경우 사용자는 저장, 커밋 등 변경 사항을 고민하지 않아도됩니다. Binding의 NSUndoManager과의 통합은 사용자가 수행 한 모든 작업을 취소 할 수 있음을 의미합니다 (실행 취소 할 수 있어야합니다). 모든 사용자 작업은 변경 작업을 수행 한 후 실행 취소해도 사용자의 데이터 나 응용 프로그램 상태에 불필요한 "해를 끼치 지 않도록"위험이 적어야합니다. 모델 레이어에 핵심 데이터를 사용하는 경우 NSManagedObjectContext의 메소드를 사용하여 프로그래밍 방식으로 변경 사항 집합을 언제든지 롤백하거나 저장할 수 있습니다. 이 정말로인데, 사용자가 "제출"버튼을 필요로하는 좋은 이유가 아니라면, 입력하지 마십시오.이 철학에 맞춰 Gmail의 "보내기 취소"기능이 있습니다. 전자 메일을 보내는 것조차도 실행 취소 할 수 있어야합니다 (이유 내에서).

두 번째 대답은 더 실용적입니다. 물론 코코아와 같은 일을 용서하지 않는 백엔드 시스템을 다루는 상황이 있습니다. 이 경우 가장 좋은 방법은 UI의 모델 역할을하는 임시 모델 객체를 만드는 것입니다 (MVVM (Model-View-View-Model) 아키텍트에서 View-Model을 생각해보십시오). 사용자가 변경 사항을 제출하면 임시 모델 객체를 영구 모델에 복사 할 수 있습니다. 핵심 데이터에서 별도의 관리 객체 컨텍스트를 백업하는 메모리 내장 영구 저장소를 사용하여 이러한 임시 인스턴스를 보유한 다음 제출시이 임시 컨텍스트의 변경 사항을 주 컨텍스트에 병합 할 수 있습니다.

0

이 충분 있습니다

  • 은 인터페이스 빌더에서 텍스트 필드를 선택합니다.
  • Inspector 패널의 "Text Field Attributes"창으로 전환하십시오 (Cmd-1을 누르십시오).
  • 작업 팝업 상자를 "보낸 사람 만 허용"으로 변경하십시오.