IBOutletCollection ensemble de la commande dans Interface Builder
Je suis en utilisant IBOutletCollections de regrouper plusieurs Instances de semblables Éléments de l'INTERFACE utilisateur. En particulier, je groupe un certain nombre de UIButtons (qui sont semblables à des ronfleurs dans un jeu de quiz) et un groupe de UILabels (ce qui affiche le score). Je veux faire en sorte que l'étiquette directement sur le bouton mises à jour de la partition. J'ai pensé qu'il est plus facile d'y accéder à l'index. Malheureusement, même si je les ajouter dans le même ordre, ils n'ont pas toujours les mêmes indices. Est-il un moyen dans Interface Builder pour définir le bon de commande.
Vous devez vous connecter pour publier un commentaire.
EDIT: Plusieurs intervenants ont affirmé que les plus récentes versions de Xcode retour
IBOutletCollections
dans l'ordre les connexions. D'autres ont prétendu que cette approche n'a pas de travail pour eux dans les storyboards. Je n'ai pas testé moi-même, mais si vous êtes prêt à s'appuyer sur les sans-papiers comportement, vous pouvez constater que le tri explicite que j'ai proposé ci-dessous n'est plus nécessaire.Malheureusement, il ne semble pas être un moyen de contrôler l'ordre d'un
IBOutletCollection
de l'IB, de sorte que vous aurez besoin de trier le tableau après avoir été chargés d'après certaines propriétés de la vue. Vous pouvez trier les vues basées sur lestag
de propriété, mais de régler manuellement les balises de l'IB peut être assez fastidieux.Heureusement, nous avons tendance à exposer nos points de vue dans l'ordre que nous voulons pour y accéder, il est souvent suffisant pour trier le tableau basé sur la position x ou y comme ceci:
[self.tableView indexPathForCell:cell1].row
(et éventuellement.section
si votre table a plus d'un). Je n'ai pas essayé avec des tables statiques, mais je suppose que les tableaux statiques ne pas réutiliser leurs objets de cellule, donc il semble que cela devrait fonctionner.[array sortedArrayUsingComparator:^NSComparisonResult(UIView * view1, UIView * view2) { return [@(view1.tag) compare:@(view2.tag)]; }];
array.sortInPlace({ $0.tag < $1.tag })
J'ai couru avec cduhn réponse et fait de ce NSArray catégorie.
Si maintenant xcode vraiment préserve la conception de la commande en temps ce code n'est pas vraiment nécessaire, mais si vous vous trouvez avoir à créer/recréer les grandes collections de l'IB et ne veulent pas à vous soucier de gâcher ce qui pourrait aider (au moment de l'exécution). Aussi une note: il est probable que l'ordre dans lequel les objets ont été ajoutés à la collection a quelque chose à voir avec la "ID de l'Objet" que vous trouverez dans l'Identité de l'Inspecteur de l'onglet, ce qui peut être sporadique à mesure que vous modifiez l'interface et d'introduire de nouveaux objets de la collection à une date ultérieure.
.h
.m
Puis d'inclure le fichier d'en-tête que vous avez choisi pour le nom et le code peut être:
Ne sais pas quand cela a changé exactement, mais comme de Xcode 4.2 au moins, ce qui ne semble plus être un problème. IBOutletCollections aujourd'hui de préserver l'ordre dans lequel les points de vue ont été ajoutés dans Interface Builder.
Mise à JOUR:
J'ai fait un projet de test pour vérifier que c'est le cas: IBOutletCollectionTest
Pas pour autant que je suis conscient.
Comme une solution de contournement, vous pouvez attribuer à chacun d'eux une étiquette, de façon séquentielle. Avoir les boutons de gamme 100, 101, 102, etc. et les étiquettes de 200, 201, 202, etc. Puis ajouter 100 pour le bouton de la balise pour obtenir son correspondant de l'étiquette de l'étiquette. Ensuite, vous pouvez obtenir le label en utilisant
viewForTag:
.Alternativement, vous pouvez regrouper les objets correspondants dans leur propre
UIView
, si vous ne disposez que d'un seul bouton et un label per view.J'ai trouvé que Xcode sortes la collection par ordre alphabétique aide de l'ID de la connexion.
Si vous ouvrez la version de l'éditeur de votre plume fichier, vous pouvez facilement modifier les id (en s'assurant qu'ils sont uniques sinon Xcode va planter).
Il aide si vous commandez votre objet manuellement dans le plan du Document de l'IB, de sorte qu'ils se présentent dans l'ordre dans le code xml.
Il semble très aléatoire comment IBOutletCollection est commandé. Peut-être que je ne suis pas la compréhension de Nick Lockwood méthodologie correctement - mais j'ai ainsi fait un nouveau projet, a ajouté un tas de UILabels, et connecté à une collection dans l'ordre où ils ont été ajoutés à la vue.
Après la connexion, j'ai reçu un ordre aléatoire. C'était très frustrant.
Ma solution a été de déterminer des balises de l'IB et puis trier les collections de la sorte:
Ici, resultRow1 est un IBOutletCollection d'environ 7 les étiquettes, les étiquettes, définie par le biais de l'IB. Ici est la méthode de tri:
Faisant cela, je peux maintenant accéder à des objets en utilisant
[resultRow1 objectAtIndex: i]
ou tel. Cela permet d'économiser les frais généraux d'avoir à parcourir et de comparer les balises à chaque fois que j'ai besoin pour accéder à un élément.J'avais besoin de cette commande, pour une collection de UITextField objets pour la configuration où le bouton "Suivant" sur le clavier conduirait à (champ de tabulation). Cela va être une application internationale, donc je voulais la direction de la traduction ambiguë.
.h
.m
D'utilisation (après sa mise en page)
Ici est une extension que j'ai créé sur
Array<UIView>
de trier partag
, par exemple, utile lorsque l'on travaille w/IBOutletCollection
s.L'extension proposée par @scott-gardner est une grande & résout les problèmes, comme une collection de [UIButtons] apparaît pas dans l'ordre attendu. Le code ci-dessous est mis à jour pour Swift 5. Merci vraiment va à Scott pour cette!
l'extension de Tableau où l'Élément: UIView {