La Vue De La Table De Rechargement Sections Se Bloque
J'ai une vue de table avec 4 sections et 1-2 vue de la table de cellules par section. La première cellule a un uiswitch comme un accessoire de vue et contrôles le thème de couleur de l'application, de la commutation entre le mode jour et le mode nuit. Une fois que le commutateur est frappé d'une fonction est appelée, en changeant les couleurs de la barre de navigation et la couleur d'arrière-plan. Dans cette fonction, j'ai aussi mis la ligne
[self.tableview reloadData];
pour mettre à jour la table elle-même avec les nouvelles couleurs. Il fonctionne très bien mais ya pas d'animation, j'ai donc utilisé ce lieu
[self.tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)] withRowAnimation:UITableViewRowAnimationFade];
Lorsque cette ligne est utilisé le commutateur est coincé et l'application se fige. Il ne plante pas, c'est à dire il n'y a pas de crash, il vient de se fige et le uiswitch s'arrête milieu de l'animation.
J'ai remarqué que je peux recharger les sections qui n'ont pas de cellules qui contiennent accessoire de vues, et il fonctionne parfaitement avec l'animation de fondu. I. e. cela fonctionne
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade];
Parce que la troisième section n'a pas de cellules avec l'accessoire points de vue. Mais tout article qui a une cellule qui contient un accessoire de vue (c'est à dire les sections 0 et 2) si j'ai essayer et de le recharger l'appli se fige.
Des idées pourquoi ce qui se passe? Ci-dessous mon cellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
if (indexPath.section == 0) {
cell.textLabel.text = [section0 objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if (indexPath.row == 0) {
cell.accessoryView = colorSchemeSwitch;
}
else if (indexPath.row == 1) {
cell.accessoryView = autoLockSwitch;
}
}
else if (indexPath.section == 1) {
cell.textLabel.text = [section1 objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
else if (indexPath.section == 2) {
cell.textLabel.text = [section2 objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%i \t", (int)app.fontSize];
fontSizeSlider.value = app.fontSize;
cell.accessoryView = fontSizeSlider;
}
else if (indexPath.section == 3) {
cell.textLabel.text = [section3 objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.detailTextLabel.text = app.color;
}
cell.backgroundColor = app.cellBackgroundColor;
cell.textLabel.textColor = app.textColor;
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = app.cellSelectedColor;
[cell setSelectedBackgroundView:backgroundColorView];
return cell;
}
C'est vraiment bizarre, il n'y a pas de crash, l'application se bloque, il ne plante pas. Le commutateur est coincé dans le milieu et l'application cesse de répondre. Pas de crash
toutes les suggestions?
Vous pouvez gérer des Objets de la Cellule de la Table. Et d'Éviter trop de calculs en CellForRawAtIndexPath: la Méthode. De le garder aussi simple que vous le pouvez.
OriginalL'auteur jcooper_82 | 2014-11-05
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème dans
UITableViewCell
comprenantUISwitch
. J'ai résolu le problème en appelant[self.tableview reloadData]
avant de recharger les sections:Le même problème se produit si vous appelez:
sans avoir à recharger les données de la première.
Si nous faisons appel à recharger table, alors pourquoi rechargement de la section est nécessaire pour l'animation ? (H)
Je suis d'accord avec @dip, soit "reloadData" ou "reloadSections" doit être appelé, mais pas les deux. Cela dit, je aléatoirement obtenir un SIGABRT collision avec l'aide de seulement "reloadSections" entre "beingUpdates" et "endUpdates". Je suis encore à essayer de comprendre pourquoi...
Je suis d'accord avec les commentaires ci-dessus. Soit utiliser reloadData ou reloadSections, les deux n'a pas de sens
Je crois que vous devez appeler reloadData au moins une fois - pour que les numberOfSections fonction de délégué à être appelé. Ensuite, vous pouvez appeler reloadSection que nécessaire (et alors que le nombre de sections est de ne pas changer).
OriginalL'auteur pjuzeliunas
vous n'avez pas ajouté un crash, mais im deviner que vous obtenez un message d'erreur indiquant un certain nombre de lignes dans une section doit être égale à une certaine valeur avant une mise à jour. Si c'est le cas,
Avez-vous utilisé
[self.tableview beginUpdates]
avant de recharger la table et[self.tableview endUpdates]
après rechargement?J'ai essayé de prendre en sandwich avec le code de début et de fin des mises à jour mais pas de changement
essayez de l'ajouter ici dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ //mettre le code ici});
Essayé ce code ne s'exécute pas et l'application continue à se fige. Encore une fois pas de crash disponible
Cela a résolu le mien problème, merci
OriginalL'auteur Frantzdy Romain