Pergunta

Esta é uma pergunta muito iniciante, e isso é algo que já fiz muitas vezes antes, mas há algo que estou perdendo desta vez.

No meu arquivo appdelegate.h, declaro um nsarray e o defina como uma propriedade:

@interface AppDelegate : NSObject {
NSArray *lines;

}

@property(readwrite, retain) NSArray *lines;
@end

E então, no arquivo appdelegate.m no método despertável, eu o alocão:

lines = [[NSArray alloc] init];

Então eu tenho um método que define a matriz de linhas:

NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL];
lines = [fileContents componentsSeparatedByString:@"\n"];

Eu tenho um controlador de matriz que AppDelegate.self.lines Então eu tenho uma coluna de mesa ligada a Array Controller.arrangedObjects. Posso confirmar que a matriz está sendo atualizada (testada usando NSLog), no entanto, o conteúdo da tabela não está sendo atualizado (ela permanece em branco).

Há algo óbvio que estou perdendo aqui?

Foi útil?

Solução

Você não precisa de uma fonte de dados se estiver usando ligações. Uma ou outra.

Eu tenho um controlador de matriz que está obrigado a "appDelegate.Self.Lines"…

Por que self?

@Property (readwrite, reter) linhas nsarray *;

Não, use copy aqui. Caso contrário, você se encontrará mantendo a matriz mutável de outra pessoa, que eles mudarão. Em seguida, a sua matriz "sua" terá mudado sem você saber.

Então eu tenho um método que define a matriz de linhas:

lines = [fileContents componentsSeparatedByString:@"\n"];

É por isso que a tabela não mostra nada. Você não está passando pela propriedade, está acessando a variável de instância diretamente. A variável de instância direta acessos não causam notificações KVO; portanto, o controlador de matriz nunca descobre a alteração.

Pior ainda, você está vazando a matriz antiga (já que você simplesmente atribui a ela sem liberá-la) e assinando essa nova matriz. Como você não está mantendo a nova matriz, essa variável de instância manterá um objeto morto em breve. A retenção automática é feita pelo setLines: Método, que só é chamado quando você o chama.

Você precisa passar pela propriedade:

self.lines = [fileContents componentsSeparatedByString:@"\n"];

Um acesso à propriedade é uma mensagem de acessador implícita, então isso mantém a matriz (ou copia -a, depois de corrigir o @property como sugeri acima) e publica notificações KVO.

Outras dicas

Quando você diz que tem um OrganSedObjects ligado à coluna, você quer definir o TablView DataSource? Se não você para definir a matriz de dados da TableView para a matriz de linhas

Você pode querer Leia isso, tem alguns bons diagramas e explicações. O que Ennuikiller está dizendo está correto, acho que é um problema com o seu painel de dados. Isso é feito ligando

[aTable setDelegate:aDelegate];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top