7
votes

Comment puis-je accéder par programme d'éléments d'interface utilisateur dans une nib sans les "câbler"?

Je contemplerai d'écrire des fonctions d'assistance pour faciliter les modifications simples des éléments de l'UI de mon iPhone Nib. Principalement - je veux accéder à un Uilabel ou à un autre élément, via son nom dans l'interface Builder. Est-ce possible? Y a-t-il une approche plus intelligente?

Exemple

Dites que je veux faire une application iPhone super simple qui affiche "Hello World". Je commence un nouveau projet, puis ouvrez la nibrage et faites glisser un Uilabel à mon avis et donnez-lui un «nom» de 'lblmain'. Maintenant, supposant que j'ai inclus ma fonction d'assistance pratique, j'aimerais affecter l'étiquette de nouveau texte quelque chose comme ceci: xxx -p> -or- xxx

maintenant - le truc est que je n'ai pas ajouté de: xxx

n'importe où dans .h fichier - je viens d'accéder à Cette étiquette de manière dynamique - cela ne serait-ce pas gentil ?!

Maintenant, pour des applications simples, d'ajouter des étiquettes ou des images supplémentaires, je pourrais les faire glisser dans ma nibr, attribuer des noms dans la fenêtre de l'inspecteur de cet élément, puis accumulez-les immédiatement à l'intérieur du code sans le bégaiement et le tracas de les ajouter dans le fichier .h.

Motivation
  • Fondamentalement, je suis frustré que je doive filer tous les éléments de ma nibre - c'est beaucoup de bégaiement et de comptabilité que je préfère éviter.
  • Je pourrais donner une conception des conventions de dénomination, et ils pourraient générer une nibrité sans avoir à être intime avec la mise en œuvre.


1 commentaires

8 mois plus tard, j'ai décidé de creuser un peu. Ce n'est pas une solution complète, mais une fois que vous avez indiqué à un objet que vous avez signalé comme accessible, vous pouvez lire son étiquette via "[LBL AccessibellLabel];" Ce pourrait être un début pour quelqu'un.


5 Réponses :


4
votes

Vous pouvez définitivement charger la NIB de manière programmatique, trouver tous les objets et les interroger pour déterminer quels points sur quoi. Il suffit de regarder Chargement de fichiers NIB programmatiquement . Mais le problème est que le nom d'identité de constructeur d'interface n'est pas exposé à l'extérieur de l'IB. Donc, je ne suis pas sûr de ce que vous utiliseriez comme paramètre "ForLabel". Le champ "nom" n'est qu'une commodité pour la fenêtre de document IB. Ce n'est pas une propriété sur nsobject .


2 commentaires

Je savais que j'avais vu une référence à cela avant, mais je ne pouvais pas le placer / le retrouver. Merci. HMM, toutes suggestions concernant une manière inoffensive d'envoyer quelque chose comme un «nom» au code? Comme peut-être ajouter un "indice" dans "l'accessibilité" puis l'effacer au moment de l'exécution - ou quelque chose comme ça?


Je pourrais peut-être pré-traiter le fichier .xib dans les étiquettes, disons, indice.



8
votes

Nom est à 100% non accessible une fois que l'objet est chargé, quelque chose que j'ai toujours pensé était étrange aussi.

Ce qui est accessible est "tag", si vous voulez vraiment accéder à un élément sans définir une prise, vous pouvez définir la valeur (entier uniquement) "étiquette", puis dans la vue SuperView qui contient l'appel de l'élément étiqueté ViewwithTag: en passant dans le même entier. N'oubliez pas que la valeur par défaut est "0" alors utilisez autre chose.


0 commentaires

0
votes

Je pense que vous pouvez essayer d'ouvrir le XIB dans un éditeur externe sous forme de XML et voyez comment le compilateur le voit, vous pourriez éventuellement faire de la même manière


0 commentaires

1
votes

Il peut être fait par l'étiquette d'élément:
Disons que vous avez un fichier UIView XIB appelé «VueView» et à l'intérieur, il y a Uilabel que vous souhaitez y accéder sans câblage.

  1. Définissez une étiquette dans l'Uilabel dans le fichier XIB "ViewView", suppose que vous définissez la balise Uilabel sur 100.
  2. Après avoir chargé "VisionView" partout où vous pouvez obtenir Uilabel sans créer de câblage à l'aide de ce code.
    Uilabel * Yourlabel = (Uilabel *) [VienvieviewwithTag: 100]; // Faites ce que vous voulez à votre étiquette.

0 commentaires

0
votes

pour iOS6 + Vous pouvez utiliser le restaurateur au lieu de la balise, pour le rendre plus "lisible", par exemple, vous pouvez définir le même nom dans votre fichier NIB et dans l'ID de restauration.

Si vous ne voulez pas relier à tous les Des points de vente de votre NIB à votre ViewController, vous pouvez toujours y accéder en effectuant une recherche dans votre arborescence de la sous-système actuelle. Notez que l'arrangement Sous-Views est un arborescence (le même arbre que vous pouvez voir dans votre fichier NIB), vous devrez donc faire une certaine récursive si vous avez des vues imbriquées.

Par exemple: < Pré> xxx

Dans votre fichier NIB, vous devez avoir un bouton avec un restauéridable correspondant à "mynibbuttonView", vous pouvez trouver le Textfield RestorationID dans votre inspecteur d'identité (troisième colonne d'utilitaires)

Vous pouvez l'utiliser si vous avez un grand nombre de points de vente, vous ne voulez pas les avoir tous les liés.


0 commentaires