Alan,
Votre déclaration de « Pour l'obtenir pour afficher les nouvelles données sur tout, mais le premier » me concerne - car il me dit que vous avez probablement une seule instance DetailsViewController.
Dans votre première vue de table, ItemsViewController, vous avez probablement une méthode didSelectRowAtIndexPath:
que vous utilisez pour pousser le DetailsViewController
sur la pile UINavigationController
. Comment résoudre ce problème est simplement de créer/détruire un nouveau DetailsViewController chaque fois que mon utilisateur tape entre les vues. Alors, mon didSelectRowAtIndexPath:
ressemble souvent:
- (void) didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
NSInteger selectedRow = indexPath.row;
// Create a new view controller
DetailsViewController *tmpVC = [[DetailsViewController alloc] initWithNibName:@"foo" bundle:nil];
// Tell our new view controller what data it should be using
tmpVC.tableData = [self.someArrayOfData objectAtIndex:selectedRow];
// Push view controller and release it
[self.navigationController pushViewController:tmpVC animated:YES];
[tmpVC release];
}
Cet exemple suppose que vous avez toutes les données nécessaires pour les deux contrôleurs de vue dans votre ItemsViewController - qui peuvent ne pas être le cas ..?
Quoi qu'il en soit, votre DetailsViewController charge automatiquement les données. Lorsque vous appuyez sur "Retour" pour revenir à ItemsViewController, UINavigationController le lâche, le détruisant. Ensuite, lorsque l'utilisateur appuie sur une cellule différente, nous réexécutons ce code, créant ainsi un tout nouveau contrôleur avec des données flambant neuves - donc, bien sûr, lorsqu'il est affiché, il charge automatiquement les données - il n'est jamais affiché auparavant.
Ce que vous pouvez faire dans votre code est de conserver le DetailsViewController
en tant que propriété de la classe ItemsViewController
, puis de réutiliser l'objet. Cela peut aussi fonctionner si vous êtes préoccupé par les allocations (par exemple, si c'est une allocation très "lourde" pour faire un DetailsViewController), mais alors je pense que le meilleur endroit pour appeler reloadData n'est pas dans la classe elle-même. plutôt de la méthode didSelectRowAtIndexPath:
de ItemsViewController. La raison pour laquelle je promeus l'approche de création/destruction par opposition à l'approche du "pattern de poids mouche" est qu'elle maintient votre code plus séparé - moins il y a de liens entre les contrôleurs de vue, mieux c'est.Bien sûr, ItemsViewController dépendra toujours de DetailsViewController et le connaîtra, mais il ne doit pas nécessairement être l'inverse - et si vous ajoutez l'appel reloadData à viewWillAppear:animated:
, vous ajoutez implicitement une dépendance non-code entre les deux. . Vous savez que lorsque ItemsViewController est le "parent" dans la pile de navigation, c'est le bon comportement - mais que se passe-t-il si vous avez soudainement commencé à réutiliser cette vue dans une autre partie de votre application qui ne nécessite pas de rechargement? C'est un coup de performance pour un, et de plus, c'est le genre de dépendance cachée qui peut finir dans un bug méchant-à-trace un jour. Donc, je garderais les détails stupides et je ferais en sorte que les objets contiennent toute la complexité, s'il est vraiment nécessaire de n'avoir qu'un seul DetailsViewController (contrairement à ma première idée de le recréer à chaque fois).
quel est ce segment de code ci-dessus de? Le ItemsView ou le DetailsView ... vous avez dit qu'ils étaient les deux tables. –
désolé, j'aurais dû mentionner. Cela vient de DetailsView. – Alan