Como devo remover todos os itens de um NSTABLEVIEW controlado pelo NSArrayController?

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

  •  22-07-2019
  •  | 
  •  

Pergunta

Estou usando um NSArrayController, NSMutableArray e NSTableView Para mostrar uma lista de meus próprios objetos personalizados (embora essa pergunta provavelmente se aplique se você estiver apenas mostrando uma lista de baunilha NSString objetos também).

Em vários momentos, preciso limpar minha matriz e atualizar os dados da minha fonte de dados. No entanto, apenas ligando removeAllObjects no meu NSMutableArray O objeto não aciona as atualizações do KVO; portanto, a lista na tela permanece inalterada.

NSArrayController tem não removeAllObjects Método disponível, o que parece realmente estranho. (Tem addObject, que eu uso para adicionar os objetos, garantindo que o KVO seja acionado e a interface do usuário seja atualizada.)

A maneira mais limpa que eu consegui fazer com que isso aconteça corretamente é:

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

... Então, estou meio que tendo que fazer a notificação do KVO manualmente (esta está na minha classe de aplicativo de teste, que contém o myArray propriedade, que é NSMutableArray, como mencionado.)

Isso parece errado - existe uma maneira melhor? Do meu pesquisador, parece que algumas pessoas estão confusas com a falta de removeAllObjects dentro NSArrayController, mas não vi soluções melhores.

Eu vi esta solução:

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

Mas isso parece ainda mais desagradável para mim. Pelo menos minha solução é pelo menos marginalmente auto-documental.

A Apple não percebeu que às vezes as pessoas podem querer esvaziar um controle de lista sendo gerenciado por meio de um NSArrayController objeto? Isso parece meio óbvio, então acho que devo estar perdendo alguma coisa ...

Além: é claro, se eu adicionar novos itens à matriz (via NSArrayController), então isso desencadeia uma atualização do KVO com o NSArrayController/NSTableView, mas:

  1. Às vezes, não coloco itens na lista, porque não há. Então você apenas vê os itens antigos.
  2. Isso é um pouco eco de qualquer maneira.
Foi útil?

Solução

Você não remove itens de uma exibição de tabela. Ele não tem itens - apenas exibe os itens de outro objeto.

Se você vincular a ligação do conjunto de conteúdo do controlador de matriz a uma propriedade da matriz de algum outro objeto, deve trabalhar com essa propriedade desse objeto. Usar [[object mutableArrayValueForKey:@"property"] removeAllObjects].

Se, por outro lado, você não vincular a ligação da matriz de conteúdo do controlador de matriz, precisará interagir com o seu content diretamente. Usar [[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]. (Você também pode trabalhar com arrangedObjects ao invés de content. Se um não funcionar, tente o outro - só fiz as coisas da primeira maneira, vinculando o controlador da matriz a outra coisa.)

Outras dicas

Tive esse problema também e resolveu desta maneira:

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

Rápido

@IBOutlet var acLogs: NSArrayController!

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

trabalhou para mim.

Solução em Swift:

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

Apenas uma atualização que funciona no Swift 4:

let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top