Comment est-ce que [auto.tableView reloadData] savoir quelles données pour la recharger?
Il m'énerve à mort que mon viewcontroller, qui se trouve être un tableViewController, sait sans être dit que sa propriété qui est un NSArray ou un NSDictionary détient les données à charger dans la table pour l'affichage.
Me semble que je doit explicitement dire quelque chose comme:
[self.tableView useData:self.MyArray];
Je veux avoir plus d'un tableau à l'intérieur de mon tableViewController et de basculer entre l'un et l'autre par programmation.
J'ai remarqué que lorsque une tableViewController rend l'utilisation d'un searchViewController, vous pouvez le faire:
if (tableView == self.searchDisplayController.searchResultsTableView) {
J'ai même été en mesure de le faire:
self.tableView = self.searchDisplayController.searchResultsTableView;
[self.tableView reloadData];
Mais nulle part je ne trouve comment définir soi-même.tableView retour à la principale source de données!
je seconde!
Prouvez-moi que la documentation est tout bon en me montrant où il répond à ma question!
Vous ne pouvez pas basculer en arrière. Vous avez à stocker la table d'origine vue quelque part pour basculer vers l'autre. En passant, vous avez à stocker l'objet d'origine quelque part dans Visual C et C# aussi, en fonction de votre lame, trollish Windows chose, de toute évidence, vous savez que peu de choses sur cet environnement comme vous le faites l'environnement Mac.
Je vous suggère de lire ceci pour sauver la frustration: developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/...
OriginalL'auteur Scott Pendleton | 2010-03-14
Vous devez vous connecter pour publier un commentaire.
D'accord, je comprends votre frustration parce que la grande majorité de l'iPhone sur le matériel didactique ne paient pas suffisamment d'attention à l'ensemble de la conception d'application. Ils font un beeline pour les bonbons pour les yeux de l'interface et de payer du bout des lèvres seulement de façon que l'application doit traiter les données même si la manipulation des données est tout l'objet de l'application en premier lieu!
Le matériel didactique ne passent pas assez de temps pour expliquer le Modèle-Vue-Contrôleur modèle de conception sur laquelle l'ensemble de l'iPhone/API Cocoa est basé. Vous rencontrez un moment difficile de comprendre quoi que ce soit parce que vous continuez à essayer de caser des fonctionnalités dans le mauvais objets vertu de la croyance erronée que la vue de l'INTERFACE utilisateur est au cœur du programme, tels que le matériel didactique qui t'ont amené à croire. En vertu de ce malentendu, rien n'a de sens, pas même la Documentation d'Apple.
Vous avez besoin de prendre du recul et à repenser. Ce n'est pas la fonction d'un point de vue de décider quelles sont les données à afficher et quand pour l'afficher. Ce n'est pas la fonction de l'affichage de la table de contrôleur de détenir, de gérer ou de stocker de l'application des données. Ces fonctions relèvent du modèle de données objet (que vous avez probablement jamais entendu parler.) Vous avez de la difficulté parce que vous êtes en train de séparer le modèle de données de la tâche à travers le point de vue et le point de vue du contrôleur ont été elles n'appartiennent pas.
Apparemment, votre application n'a même pas un modèle de données parce que vous êtes la tenue de la table de données en tant que propriétés de la tableview contrôleur. Bien que vous voyez souvent cette simpliste tutoriel, exemples, c'est un mauvais design, qui va s'effondrer en vertu de la complexité de tout mais le plus trivial des applications.
Au lieu de cela, vos données doivent être stockées et gérées dans son propre objet personnalisé. C'est le modèle de données. Dans votre cas, il semble que vous avez données réparties sur deux tableaux afin de créer un modèle de données objet quelque chose comme ceci:
(Notez que les données réelles sont encapsulées et que d'autres objets ne peuvent accéder à la
currentlyUsedArray
. Le modèle de données qui décide de données à fournir en fonction de l'état interne des données.)Ce modèle de données objet doit être dans un universellement accessible. La meilleure méthode est d'en faire un singleton, mais la rapide et sale de la méthode est de se garer comme un attribut de l'délégué d'application.
Afin de vous tableview contrôleur de vous aurait une propriété:
puis dans la mise en œuvre
Puis dans votre tableview de la source des données méthode:
Si certains événements n'importe où dans l'application nécessite de passer des tableaux, vous appelez modèle de données de l'objet à partir de l'app délégué et l'envoyer à la appropriée de l'interrupteur de tableau de message.
Maintenant toutes les données, que ce soit dans ce tableau ou certains autres complètement sans rapport avec vue, utilisez le formulaire de données le bon tableau.
Pourquoi passer par tout ce mal? Cela rend l'application modulaire. Vous pouvez facilement ajouter sur les différents points de vue de chacun d'afficher les données d'une manière différente sans avoir à réécrire la gestion de vos données à chaque fois. Vous pouvez utiliser le modèle de données pour gérer les données qui seront affichées dans un tableau, dans une webview ou sur la ligne de commande. Vous pouvez même déplacer facilement le modèle de données à une tout autre application.
Cette modularité rend la gestion complexe des grandes applications de manière beaucoup plus facile. Vous n'avez qu'un objet qui manipule et contrôle les données. Vous n'avez pas à vous inquiéter que les quelques erreurs mineures dans certains rarement utilisé segment de code sera corbeille de la totalité de l'app. Vous pouvez les vues du plugin facilement ou de les supprimer facilement sans casser l'application.
C'est bien sûr un exemple trivial, mais il montre de bonnes pratiques.
Toutefois, vous pouvez demander, comment résoudre le problème de la tableview savoir quelles sont les données à charger et quand le charger? Simple, il ne le fait pas. Il n'est pas le travail de la tableview de savoir quelles sont les données à charger ou quand la charge. Le modèle de données gère des données et tableview contrôleur gère la quand. (Vous pouvez même avoir le modèle de données d'émettre des avis lorsqu'elle est mise à jour par exemple, pour une url. le point de vue du contrôleur pouvez vous inscrire pour la notification et l'appel
reloadData
chaque fois que le modèle de données de changement).Par impitoyablement de cloisonnement et l'encapsulation des fonctionnalités en MVC, à vous de créer des applications à partir de simple, de composants réutilisables qui sont faciles à entretenir et à déboguer.
C'est vraiment mauvais la plupart du matériel didactique seulement du bout des lèvres à présent totalement concept critique.
Problème: le premier tableau est plus long que le deuxième. Lorsque je change les tableaux et les appeler [auto.tableView reloadData], il appelle ensuite tableView:cellForRowAtIndexPath: une fois pour chaque élément dans le tableau plus, ce qui provoque une erreur de limites. Cela prouve que l'auto.tableView a en quelque sorte pris note de la longueur du tableau original. Mais le numéro n'est plus valable! Vous dites que c'est pas la tableView de savoir quelles sont les données à charger. Eh bien, [self.tableView reloadData] appelle tableView:cellForRowAtIndex:, et pour savoir combien de fois, il FAUT savoir à propos de sa source de données! Vous voyez le problème?
êtes-vous à l'aide de la méthode numberOfRowsInSection: et numberOfSectionsInTableView: ? Qui est destiné à retourner le nombre de lignes dans le tableau (et l'article). Dans ce cas numberOfRowsInSection: faut juste retour de [soi.theDataModel.currentlyUsedArray count]; Cette def est appelée à chaque fois que vous appelez [self.tableau reloadData]; mais vous ne savez pas ce qui pourrait arriver si vous ne définissez pas cette.
Ça y est! C'est la pièce manquante du puzzle. Ainsi, le tableViewController n'a vraiment pas de savoir ou de se rappeler quelles sont les données que vous lui donnez. Il vous suffit d'utiliser deux méthodes, l'une pour lui donner le nombre de lignes, et un à lui donner les données ligne par ligne, et le tour est joué! Merci beaucoup à tous.
Ne prenez pas infraction à cela, mais je sent qu'on va continuer à s'attirer des ennuis. Vous êtes le codage en utilisant les concepts des autres langages de programmation et de rester coincé parce que vous êtes en essayant de les appliquer à l'iPhone dev. Je suis passé par la chose exacte et est devenu très frustré. Je recommanderais de ne pas faire des exemples que vous trouverez sur le net, mais au lieu d'avoir un coup d'oeil à Stamfords iPhone conférences disponibles sur iTunes. Personnellement, je pense que les concepts de la programmation sur l'iPhone sont très différentes des autres langues et sont très précieux une fois que vous les connaissez, vous pouvez les ramasser en un jour et vous rendre la vie facile
OriginalL'auteur TechZen
Une table view controller n'est pas "savoir sans être dit" quoi que ce soit-- il ne fournit pas en soi une propriété que vous mentionnez que proviennent les données. Vous fournissez des données, une cellule à la fois, en général, à votre avis, contrôleur de la sous-classe.
Généralement à votre table view controller objet est à la fois la vue de la table du délégué et de l'affichage de la table de source de données délégué. De la Pomme docs:
La vue de la table n'est pas à prendre dans un tableau ou d'un dictionnaire et d'extraire des données à partir d'elle; il vous demande dans votre source de données que chaque cellule devrait ressembler. Vous venez de mettre en œuvre cette méthode:
Et retourner tout contenu dans une cellule que vous souhaitez pour la ligne que vous avez posées à propos de. Vous pouvez mettre de la logique dans il pour mélanger/match/extraire des données à partir d'où vous voulez.
Votre confusion venir à partir d'une soupe de l'exemple de code c'est peut-être pas clair sur ce qu'il se passe? Je vous recommande la construction d'un tableau de la vue à partir de zéro pour voir comment cela fonctionne-il est facile de le faire en ajoutant une nouvelle classe à votre projet, vous pouvez sélectionner un UITableViewController sous-classe de l'intérieur de XCode dans la "nouvelle" de l'assistant. Il préremplir le .m fichier avec toutes les méthodes vides, y compris les ci-dessus.
EDIT: Ne pas changer la vue de la table de votre vue-contrôleur possède lorsque vous faites une recherche. Vous êtes à la confusion de l'instance de référence appelé "tableView", votre point de vue contrôleur possède, avec l'argument de la méthode du délégué
tableView:cellForRowAtIndexPath:
, qui vient de se passer pour vous dire qui la vue de la table est en demande d'une cellule. Lorsque vous avez de la recherche mis en place dans le chemin normal avec la même viewcontroller étant le délégué à la fois le défaut/contenu de la table et les résultats de recherche, vous pourriez être appelé avec les deux. Voir ici pour les docs sur ce.Édité pour ajouter des informations à ce sujet: re: résultats de la recherche. Scott: je comprends qu'il peut être une bataille difficile à comprendre quelques-uns de ces dessins. Mais vous devriez noter que vous êtes beaucoup plus susceptibles d'obtenir des réponses utiles et de l'aide si vous n'écrivez pas comme si vous êtes de s'en prendre à vos collègues de Débordement de Pile membres. Le miel, le vinaigre, etc.
De bons conseils, merci.
OriginalL'auteur Ben Zotto