Voltar ao Controlador de Navegação faz com que os itens da Visualização da Coleção sejam duplicados
-
21-12-2019 - |
Pergunta
Eu acho que essa é provavelmente uma solução simples, mas estou lutando para encontrar a solução certa que tenho o seguinte:
Lista de Contatos - uma UICollectionView
que carrega o conteúdo com viewDidAppear:
método.Quando um item é selecionado na visualização da coleção eu aciono este método:
[self performSegueWithIdentifier:@"pushContactDetail" sender:self];
Até agora tudo bem.Tudo funciona muito bem.No entanto, quando navego de volta da página ContactDetail usando o botão Controlador de navegação, meu ContactList duplica o conteúdo.
Há algo que eu deveria fazer para evitar o viewDidAppear:
de correr novamente?
Não acho que queira definir a coleção como nula ao enviar a página ContactDetail, pois isso faria com que o conteúdo fosse recarregado a cada vez...
Aqui está o código:
-(void) viewDidAppear
{
[super viewDidAppear];
[self.view setBackgroundColor:myColorLightGrey];
_contactList = [[NSMutableArray alloc] init];
[self displayLoadingAndDisableTableViewInteractions];
[self queryData];
}
- (void) queryData
{
//Find the Data
PFQuery *query = [PFUser query];
PFUser *consumer = [PFUser currentUser];
[query includeKey:User_followers];
[query whereKey:@"email" equalTo:consumer.email];
query.maxCacheAge = 60 * 60 * 24; // One day, in seconds
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
for (PFUser *tmpConsumer in objects)
{
for (PFUser *publisher in [tmpConsumer objectForKey:User_followers])
{
[_contactList addObject:publisher];
}
}
[_collectionView reloadData];
[self hideLoadingAndEnableTableViewInteractions];
}];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"contactCell";
ContactCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
//SNIPPED REMAINDER OF CODE
...
}
Solução
Na tua queryData
método, anule o array primeiro
_contactList = nil;
_contactList = [NSMutableArray array]; // or [[NSMutableArray alloc] init];
Mova o método alloc/init para _contactList
assim:
- (void) queryData
{
_contactList = nil;
_contactList = [[NSMutablArray alloc] init];
//Find the Data
PFQuery *query = [PFUser query];
PFUser *consumer = [PFUser currentUser];
[query includeKey:User_followers];
[query whereKey:@"email" equalTo:consumer.email];
query.maxCacheAge = 60 * 60 * 24; // One day, in seconds
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
for (PFUser *tmpConsumer in objects)
{
for (PFUser *publisher in [tmpConsumer objectForKey:User_followers])
{
[_contactList addObject:publisher];
}
}
[_collectionView reloadData];
[self hideLoadingAndEnableTableViewInteractions];
}];
}
Outras dicas
Navegar de volta com a animação true.Vai resolver o seu problema.