nsarraycontroller가 제어하는 nstableview에서 모든 항목을 어떻게 제거해야합니까?
-
22-07-2019 - |
문제
나는 사용하고있다 NSArrayController
, NSMutableArray
그리고 NSTableView
내 자신의 사용자 정의 객체 목록을 보여 주려면 (이 질문은 바닐라 목록을 보여 주면 아마도 적용됩니다. NSString
물체도).
다양한 시점에서 배열을 지우고 데이터 소스에서 데이터를 새로 고침해야합니다. 그러나 그냥 전화하십시오 removeAllObjects
내 NSMutableArray
객체는 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
, 하지만:
- 때로는 목록에 항목을 넣지 않습니다. 왜냐하면 아무것도 없기 때문입니다. 그래서 당신은 오래된 아이템 만 볼 수 있습니다.
- 어쨌든 이것은 약간 유키입니다.
해결책
테이블보기에서 항목을 제거하지 않습니다. 항목이 없으며 다른 객체의 항목 만 표시됩니다.
배열 컨트롤러의 컨텐츠 배열 바인딩을 다른 객체의 배열 속성에 바인딩하면 해당 객체의 속성으로 작업해야합니다. 사용 [[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))