editStyleForRowAtIndexPath – dispara no iOS 5, não dispara no iOS 6
-
11-12-2019 - |
Pergunta
Eu tenho controladores simples de visualização mestre e detalhada conectados com dois segues, um para "mostrar detalhes" e outro para "adicionar novo".
- "Mostrar detalhes" segue para o controlador de visualização de detalhes com setEditing:NO.
- Toque em "+" (adicionar ícone) para seguir para o controlador de visualização de detalhes com setEditing:YES
iOS 5.1:"+" funciona como esperado, a página de detalhes está no modo de edição e editandoStyleForRowAtIndexPath é acionado para mostrar os indicadores de inserção e exclusão.
iOS 6.0:o "+" faz a transição para a página de detalhes, mas editStyleForRowAtIndexPath nunca é acionado.Outro código que está em setEditing:YES é executado.didSelectRowAtIndexPath dispara (delegate = self).
Uma vez na página de detalhes, o modo de edição funciona conforme esperado em ambos os casos.
Alguma ideia?
// Master.m
if([[segue identifier] isEqualToString:@"NewRecipe"]) {
DetailViewController *detailViewController = [segue destinationViewController];
// stuff
detailViewController.recipe = r;
detailViewController.delegate = self;
detailViewController.editing = YES;
}
// Detail.m
-(void)setEditing:(BOOL)flag animated:(BOOL)animated {
if (flag) {
[self.tableView setEditing:flag animated:YES];
[self.tableView beginUpdates];
// the row does get added
[self.tableView insertRowsAtIndexPaths:@[pathToAdd] withRowAnimation:UITableViewRowAnimationAutomatic];
// datasource gets updated here
[self.tableView endUpdates];
....
}
}
Solução
Eu descobri.Não sei por que essa é a solução, espero que isso não substitua o código ruim por um código pior.
Master.m
// iOS 5 -- this is OK
detailViewController.editing = YES;
Para iOS 6, eu precisava que o detailViewController fizesse uma chamada para um método delegado para determinar se setEditing:YES.
Master.m
-(BOOL)isNewRecipe {
return (_isNewRecipe == 1);
}
Detail.m
if ([self.delegate isNewRecipe]) {
[self setEditing:YES];
}