nsarraycontroller가 제어하는 ​​nstableview에서 모든 항목을 어떻게 제거해야합니까?

StackOverflow https://stackoverflow.com/questions/646787

  •  22-07-2019
  •  | 
  •  

문제

나는 사용하고있다 NSArrayController, NSMutableArray 그리고 NSTableView 내 자신의 사용자 정의 객체 목록을 보여 주려면 (이 질문은 바닐라 목록을 보여 주면 아마도 적용됩니다. NSString 물체도).

다양한 시점에서 배열을 지우고 데이터 소스에서 데이터를 새로 고침해야합니다. 그러나 그냥 전화하십시오 removeAllObjectsNSMutableArray 객체는 KVO 업데이트를 트리거하지 않으므로 화면의 목록은 변경되지 않았습니다.

NSArrayController 가지다 아니요 removeAllObjects 사용 가능한 방법, 정말 이상해 보입니다. (가지고 있습니다 addObject, 객체를 추가하는 데 사용하여 KVO가 트리거되고 UI가 업데이트되도록합니다.)

내가 이런 일을 정확하게 일으키는 가장 깨끗한 방법은 다음과 같습니다.

[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];

... 그래서 나는 KVO 알림을 수동으로 직접 수행해야합니다 (이것은 내 테스트 앱 클래스에 있습니다. myArray 재산입니다 NSMutableArray, 말한 바와 같이.)

이것은 틀린 것 같습니다 - 더 좋은 방법이 있습니까? 내 인터넷 검색에서 그것은 몇몇 사람들이 부족에 의해 혼란스러워 보인다. removeAllObjects 안에 NSArrayController, 그러나 더 나은 솔루션을 보지 못했습니다.

이 솔루션을 보았습니다.

[self removeObjectsAtArrangedObjectIndexes:
  [NSIndexSet indexSetWithIndexesInRange:
    NSMakeRange(0, [[self arrangedObjects] count])]];

그러나 이것은 나에게 훨씬 더 불쾌 해 보인다. 적어도 내 솔루션은 적어도 자체 문서화입니다.

애플은 때때로 사람들이 NSArrayController 물체? 이것은 분명한 것 같아서 뭔가 빠진 것 같아요 ...

따로 : 물론, 배열에 새 항목을 추가하면 ( NSArrayController), 이렇게하면 KVO 업데이트가 NSArrayController/NSTableView, 하지만:

  1. 때로는 목록에 항목을 넣지 않습니다. 왜냐하면 아무것도 없기 때문입니다. 그래서 당신은 오래된 아이템 만 볼 수 있습니다.
  2. 어쨌든 이것은 약간 유키입니다.
도움이 되었습니까?

해결책

테이블보기에서 항목을 제거하지 않습니다. 항목이 없으며 다른 객체의 항목 만 표시됩니다.

배열 컨트롤러의 컨텐츠 배열 바인딩을 다른 객체의 배열 속성에 바인딩하면 해당 객체의 속성으로 작업해야합니다. 사용 [[object mutableArrayValueForKey:@"property"] removeAllObjects].

반면에 배열 컨트롤러의 컨텐츠 배열 바인딩에 결합하지 않은 경우와 상호 작용해야합니다. content 곧장. 사용 [[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]. (당신은 또한 함께 일할 수 있습니다 arrangedObjects 대신에 content. 하나가 작동하지 않으면 다른 사람을 시도해보십시오. 첫 번째 방식으로 만 해본 적이 있습니다. 배열 컨트롤러를 다른 것에 바인딩하십시오.)

다른 팁

이 문제가 있었고 이런 식으로 해결했습니다.

NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];

빠른

@IBOutlet var acLogs: NSArrayController!

acLogs.removeObjects(acLogs.content as! [AnyObject])

나를 위해 일했습니다.

Swift의 솔루션 :

if let ac = arrayController
{
    let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
    let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
    ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}

Swift 4에서 작동하는 업데이트 :

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top