2010-05-07 4 views
3

배열 컨트롤러에서 객체 수를 제한하려고하지만 필요한 경우 전체 배열에 액세스 할 수 있기를 원합니다. 내가 생각해 낸 간단한 해결책은 NSArrayController를 서브 클래스 화하고 배열 된 실제 객체 세트에서 제한된 수의 객체를 반환하는 "limitedArrangedObjects"라는 새 메서드를 정의하는 것이 었습니다. (나는 Limiting the number of objects in NSArrayController을 본 적이 있지만 내 문제를 해결하지 못합니다.)배열 객체의 크기를 제한하기 위해 NSArrayController를 서브 클래스 화합니다.

바인딩을 통해이 속성을 관찰 할 수 있기 때문에이 속성을 selectedObjects에 설정합니다.

배열 객체를 업데이트하면 limitedArrangedObjects가 alignedObjects의 값 변경을 관찰하지 않는 것 같습니다. limitedArrangedObjects에 NSCollectionView를 연결했는데 0 개체가 표시되었습니다. (배열 객체를 대신에 객체에 바인딩하면 모든 객체가 예상대로 표시됩니다.)

문제점 :

@property (readonly) NSArray *limitedArrangedObjects; 

- (NSArray *)limitedArrangedObjects; 
{ 
    NSArray *arrangedObjects = [super arrangedObjects]; 

    NSUInteger upperLimit = 10000; 

    NSUInteger count = [arrangedObjects count]; 
    if (count > upperLimit) count = upperLimit; 
    arrayToReturn = [arrangedObjects subarrayWithRange:NSMakeRange(0, count)]; 


    return arrayToReturn; 
} 


+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key; 
{ 
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([key isEqualToString:@"limitedArrangedObjects"]) { 
     NSSet *affectingKeys = [NSSet setWithObjects:@"arrangedObjects",nil]; 
     keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys]; 
    } 

    return keyPaths; 
} 

답변

-1

나에게/누가이 말을했는지 기억이 나지 않지만 keyPathsForValuesAffectingValueForKey를 사용하여 "arrangedObjects"키를 관찰하면 알림 메시지가 나타납니다. 현재 NSArrayControllers에서 작동하지 않습니다. 하위 키 (arrangedObjects.name 등)를 관찰 할 수 있지만 직접 alignedObjects를 관찰 할 수는 없습니다.

제 경우의 솔루션은 nib 파일에 일반 NSArrayController와 AFArrayController에서 두 개의 인스턴스화 된 객체를 만드는 것이 었습니다. AFArrayController는 arrangedObjects이 있습니다 같은 정의 :

- (NSArray *)arrangedObjects; 
{ 
    return [self limitedArrayFromArray:[super arrangedObjects]]; 
} 

- (NSArray *)limitedArrayFromArray:(NSArray *)theArray; 
{ 
    NSUInteger upperLimit = 0; 
    if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_5) { 
     upperLimit = 500; 
    } else { 
     upperLimit = 10000; 
    } 

    NSUInteger count = [theArray count]; 
    if (count > upperLimit) count = upperLimit; 
    NSArray *arrayToReturn = [theArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, count)]]; 


    return arrayToReturn; 
} 

을 지금, 나는 내가 제한된 집합을 얻을하려는 경우 AFArrayController에있는 모든 개체 또는 arrangedObjects을 얻으려면 내가 NSArrayController에 arrangedObjects을 관찰 할 수있다, 나는 관찰 할 수있다 NSArrayController 및 AFArrayController 모두의 하위 속성.

1

내가 아마 -arrangeObjects:을 무시하는 것입니다 다른 접근 방식을 취할 것 개체를 필터링 할 수있는 한 다음 전체를 액세스 할 수 있도록 completeArrangedObjects 같은 보조 속성을 설정 :

다음은 관련 코드입니다 정렬. 그것은이 같은보고 싶은데 그런 다음

- (NSArray*)arrangeObjects:(NSArray*)originalObjects 
{ 
    NSArray* arrayToReturn; 
    NSUInteger upperLimit = 10000; 

    NSUInteger count = [originalObjects count]; 
    if (count > upperLimit) count = upperLimit; 
    arrayToReturn = [arrangedObjects subarrayWithRange:NSMakeRange(0, count)]; 
    [self setCompleteArrangedObjects:originalObjects]; 
    return arrayToReturn; 
} 

방금 ​​arrangedObjects에 NSCollectionView를 결합하는 것, 그리고 당신이 completeArrangedObjects에 대한 세터를 사용하고 있기 때문에, 그것은 또한 당신이 결합 할 경우 적절한 경우 KVO 알림을 트리거한다 그것뿐만 아니라.

+0

이것은 잠재적으로 훌륭한 해결책이 될 수 있지만 completeArrangedObjects의 하위 속성에 바인딩해야하는 경우에는 작동하지 않습니다. 예를 들어 NSArrayController의 "name"이라는 객체의 속성이 있는데 별도의 테이블보기에서 바인딩 할 수 있습니다. arrangeObjects :를 재정의하고 새로운 completeArrangedObjects 속성을 만드는 경우 예외를 throw하므로 "name"하위 속성에 바인딩 할 수 없습니다. [ addObserver : forKeyPath : options : context :]는 지원되지 않습니다. 주요 경로 : 아티스트 –

관련 문제