문제

배경

응용 프로그램에 대한 소스 목록을 작성하고 있으며 두 가지 유형의 항목과 함께 iTunes와 유사한 방식으로 구조화하고 싶습니다.

  • "고정 된"항목 - 이들은 변하지 않고 움직일 수 없습니다 - 상단에서
  • 아래에 편집 가능한 항목 ~할 수 있다 사용자가 변경하십시오 - 이동, 이름이 바뀌 었습니다 (재생 목록 및 스마트 재생 목록과 같은 iTunes 예제)

내 iTunes 비유에서 :

iTunes Source List
(원천: perspx.com)

지금까지 내 데이터를 구성하는 방식은 다음과 같습니다.

  • 내가 편집하고 싶은 항목은 "그룹"항목입니다. Group 핵심 데이터 엔티티.
  • 소스 목록의 각 항목은 SourceListItem 각 항목을 제목, 아이콘, 하위 항목 등과 연결할 수 있도록 일반 대상 C 객체
  • 고정 품목은 현재로 표시됩니다 SourceListItem 인스턴스는 컨트롤러 객체의 배열에 저장됩니다.

질문

이 두 가지 유형의 항목을 소스 목록에 합병하는 방법을 잘 모르겠습니다. 따라서 고정 항목이 맨 위에 있고 항상 거기에 있고 변경되지 않으며 편집 가능한 항목이 맨 아래에 있으며 편집 할 수 있습니다.

이것들은 지금까지 내가 생각해 낸 아이디어입니다.

  • 고정 항목을 핵심 데이터 모델에 추가하십시오. 즉, 소스 목록 항목을 나타내는 엔티티를 만들 수 있고 이러한 경우에 고정되고 편집 가능한 항목이 배치 될 수 있습니다. 그런 다음 배열/트리 컨트롤러를 사용하여 개요보기 테이블 열에 바인딩 될 수 있습니다. 그러나 이것은 소스 목록 항목을 표현하기 위해 새 엔티티를 만들고 다음을 동기화해야한다는 것을 의미합니다. Group이것과 함께. 또한 모든 고정 항목을 한 번만 만들 수있는 방법이 있어야하며 지속적인 상점 파일에 어떤 일이 발생하면 고정 항목이 표시되지 않습니다.

  • 고정 항목을 그룹 항목과 병합하십시오. 둘 다 별도의 배열로 저장되지만, 개요보기가 데이터를 요청할 때 내 컨트롤러에서 수행 할 수 있습니다 (채택하는 경우 NSOutlineViewDataSource 바인딩이 아닌 프로토콜). 그러나 이것은 내가 새로운 것을 만들어야한다는 것을 의미합니다 SourceListItem배열 컨트롤러의 각 그룹에 대해 (각각 아이콘 및 기타 속성과 연결하도록),이를 저장 한 다음 그룹 배열 컨트롤러를 확인하여 변경, 추가 또는 수정할 변경을 확인하십시오. SourceListItem 그룹이 변경 될 때의 경우.

내가 이것을 구현할 수있는 방법에 대한 더 나은 아이디어가 있습니까?

내 응용 프로그램이 OS X V10.5와 호환되기를 원하므로 솔루션을 선호합니다. 그렇지 않았다 스노우 레오파드를 설치하는 데 의존합니다.

도움이 되었습니까?

해결책

나는 똑같은 동작을 가진 앱을 작업하고 있으며, 여기에 내가하는 방법은 다음과 같습니다.

핵심 데이터 모델에 5 개의 주요 엔티티가 있습니다.

  1. AbstractItem - 모든 항목에 공통적 인 속성이있는 추상 엔티티 name, weight, 그리고 editable. 또한 두 가지 관계가 있습니다. parent (하나의 관계 AbstractItem) 그리고 children (다가오는 관계 AbstractItem, 그리고 반대의 parent).
  2. Group - 콘크리트 아동 실체 AbstractItem.
  3. Folder - 콘크리트 아동 실체 AbstractItem. 기본과 다수의 관계를 추가합니다 Item 실재.
  4. SmartFolder - 콘크리트 아동 실체 Folder. 이진 속성을 추가합니다 predicateData. 재정의 Folder"항목"관계 액세서가 predicateData 기인하다.
  5. DefaultFolder - 콘크리트 아동 실체 SmartFolder. 문자열 속성을 추가합니다 identifier.

"라이브러리"섹션 항목의 경우 삽입 DefaultFolder 객체를하고 그들에게 고유 한 식별자를 제공하여 쉽게 검색하고 그들을 구별 할 수 있습니다. 나는 또한 그들에게 줘 NSPredicate 그것은 무엇에 해당합니다 Items 그들은 보여 주어야합니다. 예를 들어, "음악" DefaultFolder 모든 음악 항목, "팟 캐스트"를 검색하는 술어가있을 것입니다. DefaultFolder 모든 팟 캐스트 항목 등을 검색하는 술어가 있습니다.

루트 레벨 항목 ( "라이브러리", "공유", "상점", "천재"등이 모두 Group a nil 부모의. 편집 할 수없는 그룹과 폴더에는 editable 속성으로 설정되었습니다 NO.

실제로이 물건을 개요에서 얻으려면 NSOutlineViewDataSource 그리고 NSOutlineViewDelegate 프로토콜 스스로. 여기에 너무 많은 행동 복잡성이 있습니다. NSTreeController. 그러나 내 앱에서는 200 줄의 코드 미만으로 모든 동작을 (드래그 앤 드롭)에 넣었습니다. 저것 나쁜).

다른 팁

보기를 지원하기 위해 단순히 데이터 세트에 넌센스를 주입하지 마십시오. 이는 MVC 설계 패턴에 위배 될뿐만 아니라 가장 중요한 부분 인 사용자 데이터 관리에 불필요한 복잡성 (예 : "버그의 잠재력")을 추가합니다.

즉,이 특정 시나리오와 바인딩을 사용하는 것은 많은 마찰을 일으키는 것입니다. 바인딩을 완전히 피하지 않겠습니까? 당신은 NSoutlineViewDatasource 프로토콜을 사용하는 올바른 길을 가고 있다고 생각하지만, 당신은 그것을 충분히 받아들이지 않았습니다. 대신, 이것 (여전히 완벽하게 유효하고 어떤면에서 우수한) 프로토콜에 의존하십시오.

당신은 본질적으로 트리 구조를 완전히 제어하기 위해 편의성 (및 변경 편의성)을 거래 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top