2009-11-04 2 views
7

은의이 그림은, 내가 CoreData에 의해 백업 된 코코아의 아이튠즈 복제 응용 프로그램을 작성하고, 가정 해 봅시다. 단순화를 위하여 들어, 두 개의 "섹션"이 있습니다 가정 해 봅시다, 사용자가 생성 한 재생 목록 (단지 바보 목록, 똑똑하지 재생 목록) 보유 등 음악, 영화, 라디오, 그리고 "재생 목록"라는 두 번째 섹션 같은 것들과 함께 "라이브러리" .Cocoa에서 Bindings + CoreData를 사용하여 iTunes 스타일의 소스 목록을 구현하는 방법은 무엇입니까?

그래서 소스리스트 자체가 일반적으로 NSOutlineView로 구현 될 것이다, 그것은 일반적으로 간단합니다.

소스 목록의 라이브러리 섹션에는 실제로 사용자가 생성 한 항목이 없으며 재생 목록 섹션에는 사용자가 만든 사용자 지정 목록 만 포함하는 앱의 "기능"만 있습니다 (본질적으로). Bindings 및 CoreData를 사용하면 어떻게됩니까? 재생 목록 섹션을 사용자의 데이터에 바인딩하고 라이브러리 기능을 표시하는 맞춤식 방법을 사용할 수 있습니까?

나는 아직도 일반적으로 바인딩과 AppKit의 젖은 내 발에, 그래서 나와 함께 곰하시기 바랍니다 얻고있다. 도움에 감사드립니다. 10.6 이상을 목표로 추가해야합니다.

답변

6

나는 핵심 데이터와 경험을 많이 없었어요,하지만 난 코코아의 바인딩의 광범위한 사용을 만들었습니다. 내 경험상, "수동으로"조정 된 객체의 중간에 NSArray이 가장 적합합니다.

예를 들어 사용자가 생성 한 재생 목록 중 NSArray을 맞춤 설정하고 표준 라이브러리 항목이 포함 된 별도의 NSArray이 있다고 가정합니다. 이 설정을 사용하면 에 바인딩되는 속성 인 combinedArray이라는 컨트롤러 중 하나에서 속성을 만들 수 있습니다. 그런 다음 사용자 생성 재생 목록 배열을 컨트롤러에 바인딩하고 컨트롤러의 일부 코드에서 재생 목록 배열이 수정 될 때마다 조합 된 배열을 자동으로 업데이트합니다.

@implementation TheController 

@synthesize combinedArray; 
@synthesize userPlaylists; 
- (void)setUserPlaylists:(NSArray *)newLists 
{ 
    // standard property setting code: 
    if (newLists != userPlaylists) 
    { 
     [userPlaylists release]; 
     userPlaylists = [newLists copy]; 
    } 

    // modify the combined array: 
    NSMutableArray * allItems = [NSMutableArray arrayWithCapacity:0]; 
    [allItems addObjectsFromArray:standardLibrary]; 
    [allItems addObjectsFromArray:userPlaylists]; 
    [self setCombinedArray:allItems]; 
} 

@end 
TheController.m

TheController.h

@interface TheController : NSObject 
{ 
    NSArray * combinedArray; 
    NSArray * userPlaylists; 
} 
@property (retain) NSArray * combinedArray; 
@property (copy) NSArray * userPlaylists; 
@end 

: 여기

빠른 모형이다
+0

이것은 일종의 생각이었습니다. 그래서'setUserPlaylists'는 Bindings에 의해 호출되는 메소드일까요? 나는 바인딩이 어떻게 작동하는지에 관해서 믿을 수 없을 정도로 안개가 낀다. (나는 KVC와의 관계를 알고 있지만 배열/트리 컨트롤러로 어떻게 구성되어 있는지는 여전히 불만이다.) – jbrennan

+1

예.코코아는 뒤에서 모든 구속력있는 마법을 처리합니다. KVO/KVC를 만족하는 속성을 정의하기 만하면됩니다. 사용자가 @synthesize하는 속성은 해당 요구 사항을 충족하며 [self setSomePropertyName : someValue]를 사용할 때마다 적절한 KVC 메시지가 전송됩니다. 위의 그림과 같이 속성 설정자를 가로 채는 것은 완전히 합법적입니다. 당신의 데이터 소스가 사용자 재생 목록을위한 것인지 (CoreData에서 얻은 것임)는 확실하지 않지만 컨트롤러에 바인딩하면 컨트롤러는 해당 목록이 수정 될 때마다'setUserPlaylists :'메시지를 수신하게됩니다. –

1

이 경우 소스 목록은 실제로 "범위"이며 일부 "라이브러리 항목"엔티티의 인스턴스가 아닌 단순한 목록이 아니기 때문에 "구식"방식 (예 : 표 데이터 소스 프로토콜).

그룹화, "정적"항목 (예 : '라이브러리', '음악', '영화', '재생 목록')을 상점의 항목 (예 : 개별 재생 목록 '재생 목록'섹션 아래의 항목).

그것은 또한 "영화"그룹에 낙하에서 재생 목록 항목을 방지 할 때 열쇠 내 생각에, 드래그 앤 드롭을 처리하기 조금 쉽다.