2011-12-18 4 views
6

J'ai une tableview avec des en-têtes de section personnalisés. La vue de l'en-tête de section est définie dans le storyboard et connectée à une variable d'instance. Existe-t-il un moyen de demander une nouvelle instance de la vue à partir du storyboard?réutilisation view from storyboard

Dans le passé, je l'ai fait en ayant l'en-tête de section définie dans son propre fichier xib et d'obtenir une nouvelle instance en utilisant

[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil]; 
UIView *newHeaderView = self.sectionHeaderView; 

Répondre

3

je nai » pense qu'il ya une façon de le faire. La meilleure solution consiste à placer la vue d'en-tête personnalisée tableview dans une plume distincte et à la charger comme vous l'avez fait dans votre exemple de code chaque fois que vous en avez besoin.

+0

+1 de moi. J'ai passé des heures à essayer de comprendre comment afficher l'en-tête de table de façon Storyboard, car je pensais que Storyboard était la nouvelle et meilleure façon de présenter l'interface utilisateur de mon application. Malheureusement, l'utilisation de Storyboard échoue dans ce département et la meilleure solution est de revenir à l'ancienne façon de charger une plume pour la vue ou de construire la vue par code. Je voulais vraiment croire que toute l'interface utilisateur de mon application pourrait être faite dans un seul fichier Storyboard, mais ce n'est certainement pas le cas. – ozz

0

J'ai été capable de réutiliser une vue dans le storyboard simplement en connectant une transition d'une vue de table à celle que je veux réutiliser.

donc ma tableview que je veux réutiliser est pointée vers deux fois. Cela fonctionne en quelque sorte mais le problème que je suis en train de définir une variable (en utilisant instantiateViewControllerWithIdentifier) ​​dans mon délégué de l'application à ma vue de table qui est réutilisé. Il semble que si je le réutilise, le storyboard crée 2 instances de ma vue de table et celle que j'obtiens avec instantiateViewControllerWithIdentifier n'est pas celle que je veux.

Je ne suis pas vraiment sûr si c'est la bonne façon de le faire. Mais je suppose que beaucoup d'autres le font d'une manière ou d'une autre. Avec les cellules de tableau personnalisées dans le scénario, je soupçonne que beaucoup de gens veulent réutiliser leurs points de vue.

3

J'ai essayé de faire la même chose et j'ai rencontré le même problème. J'aime beaucoup travailler avec les storyboards et j'ai été impressionné par la rapidité avec laquelle j'ai pu créer une interface utilisateur fonctionnelle. Cependant, dès que vous avez besoin de réutiliser des vues, il est logique de les placer dans une plume distincte avec sa sous-classe UIViewController.

Vous pouvez alors placer un UIView générique dans tous les endroits où votre vue remploi devrait aller ajouter la vue à l'aide de votre ViewController:

[myReusableViewController loadView]; 
[myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself. 

[self.myReusableViewPlaceholder addSubview:myResusableViewController.view]; 
[myReusableViewController viewWillAppear:YES]; 

Donc, pour résumer:

  • Utilisez le storyboard, c'est génial
  • Créez l'échafaudage de votre application dans le storyboard, ainsi que toute vue statique (comme les écrans, etc.)
  • Créez des vues réutilisées dans une sous-classe personnalisée nib + UIViewController et ajoutez des espaces réservés UIView dans votre storyboard.

Dans une autre réponse que je pensais au sujet de certains Pros and Cons of Storyboard

+0

êtes-vous sûr que vous devez appeler les rappels vous-même - cela me parait bizarre – Rhubarb

+0

néanmoins +1 pour l'idée d'utiliser un UIView comme espace réservé. Notez que vous pouvez combiner ceci avec la réponse de Krejko ci-dessus, et au lieu de charger le contrôleur à partir d'une plume, chargez-le à partir d'un storyboard (vous pouvez utiliser un storyboard pour contenir un tas de vues variées) – Rhubarb

+0

@Rhubarb Je ne suis pas sûr à 100% que vous Vous devez faire les rappels vous-même, mais si vous intégrez la vue, alors vous êtes responsable de l'appeler, semble-t-il. S'il vous plaît noter que dans iOS6.0 il y a un nouveau mécanisme pour intégrer un ViewController entier dans une zone de votre contrôleur de vue en cours en utilisant un Segue d'intégration. Cela pourrait être une option aussi. – Besi

3

La solution que je suis venu avec pour cela est la suivante:

J'ai un tableview avec plusieurs cellules prototypes qui affiche des données complexes. Il y a une vue à une vue détaillée et une vue du processus de transaction.

Cette première tableview a un bouton de recherche qui affiche une nouvelle tableview avec les résultats.Il a besoin de la même fonctionnalité que la table principale qui le pousse; y compris les segues aux détails et les vues de progression des transactions ainsi:

Sur le storyboard, sélectionnez et copiez votre tableview principale. Désélectionnez et collez. Créez une seance push depuis votre tableview principale vers votre 2nd tableview; ou d'où vous voulez naviguer depuis. Modifiez la 2ème tableview comme vous voulez. IE: Si cela nécessite des changements d'interface utilisateur, pas de problème.

Créez une nouvelle classe viewcontroller qui est une sous-classe du viewcontroller exécutant la tableview principale. Remplacez le délégué de données dans votre sous-classe pour servir le sous-ensemble de données que vous souhaitez. Retournez dans le storyboard, sélectionnez votre 2ème contrôleur de table et dans l'inspecteur d'identité, sélectionnez votre sous-classe en tant que classe personnalisée.

Pour que cette solution fonctionne correctement, votre application doit gérer les données pour les vues. Vous pouvez utiliser prepareforsegue pour transmettre des données de la 1re tableview à la seconde, mais j'ai trouvé le modèle de données de l'application beaucoup plus flexible à partir de nombreux points de vue.

À moins que vous n'ayez des boutons qui poussent vers les sous-vues via segue, votre sous-classe devra remplacer les fonctions qui poussent via des segments avec des identités. NB Segues doit avoir des identifiants uniques si vous les identifiez du tout.

Il a fallu beaucoup d'essais et d'erreurs pour comprendre cela, mais une fois que vous avez compris le concept, c'est une solution relativement souple qui est tout à fait adaptable et pas si mal à mettre en œuvre.

3

Je ne suis pas sûr du seul point de vue, mais la façon dont j'ai réussi à faire sortir les contrôleurs de mon storyboard est la suivante. À partir de là, vous pourriez peut-être utiliser cette méthode de la même façon que pour les plumes.

+0

Ceci devrait être marqué comme la bonne réponse – Yariv

Questions connexes