Pergunta

Tenho uma aplicação que tem um UITableView. Este UITableView é preenchido por um NSMutableArray sendo realizada (como uma propriedade) no appDelegate. Você pode pensar nisso como uma janela de e-mail. Ele lista as mensagens em um UITableViewCell subclasse. Quando um novo Aparece a mensagem, eu tenho todo o código feito que baixa a mensagem, adiciona os dados para NSMutableArray do appDelegate que detém todas as mensagens. Este código está funcionando bem.

Agora, uma vez que a nova mensagem é baixado e adicionado à matriz, eu estou tentando atualizar meu UITableView usando o seguinte código, no entanto - funções de delegado do UITableView não são chamados.

O estranho é quando eu rolar meu UITableView cima e para baixo, os métodos de delegado finalmente se ligou e meus cabeçalhos de seção mudam (eles mostram a contagem de mensagens para essa seção). Shoudn't actualizado em tempo real e não esperar pela minha rolagem para acionar a atualização? Além disso, a nova célula nunca é adicionada na seção !!

Por favor, ajude !!

AppDelegate código:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method

-(void)refreshMessagesDisplay{
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO];
}

-(void)performMessageDisplay{
    [myMessagesView refresh];
}

Código UITableViewController:

-(void) refresh{
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate];

    //self.messages is copied from appDelegate to get (old and) new messages.
    self.messages=mainDelegate.messages;

    //Some array manipulation takes place here.

    [theTable reloadData];
    [theTable setNeedsLayout];  //added out of desperation
    [theTable setNeedsDisplay];  //added out of desperation
}
Foi útil?

Solução

Como uma verificação de sanidade, você tem verificado que theTable não é nulo nesse momento?

Outras dicas

Você poderia tentar colocar um atraso na chamada reloadData -. Eu tive um problema semelhante quando eu estava tentando obter o meu tableview para actualização quando reordenação células, exceto que o aplicativo caiu se eu chamasse reloadData durante it

Então, algo como isso pode valer a pena tentar:

método de actualização:

    - (void)refreshDisplay:(UITableView *)tableView {
    [tableView reloadData]; 
}

e, em seguida, chamá-lo com (digamos) um segundo de atraso de 0,5:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];

Hope funciona ...

Se você chamar reloadData de dentro de um método despachado, certifique-se de executá-lo na fila principal.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

    // hard work/updating here

    // when finished ...
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self.myTableView reloadData];
    }); 
});

.. mesmo em forma de método:

-(void)updateDataInBackground {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

        // hard work/updating here

        // when finished ...
        [self reloadTable];
    });
}

-(void)reloadTable {
       dispatch_async(dispatch_get_main_queue(), ^(void) {
            [myTableView reloadData];
        }); 
}

Você já tentou definir um ponto de interrupção em seu método de atualização apenas para ter certeza sua matriz de mensagens tem o conteúdo correto antes de chamar reloadData?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top