Swift – équivalent IBOutletCollection

J’essaie de reproduire le jeu Stanford Matchismo de “Développer des applications ios7 pour iphone et ipad” dans iTunesU à Swift.

À la page 77 des diapositives de la 3ème conférence, il montre l’utilisation d’un IBOutletCollection qui n’est pas une option sur Swift. L’exemple de document Swift montre un exemple qui a un tableau d’ IBOutlet , mais je ne vois pas comment faire en sorte qu’Interface Builder connecte plusieurs points de vente au même IBOutlet / IBOutlet .

Quelqu’un a-t-il déjà compris comment faire cela?

Je sais que je peux créer 12 points de vente et y faire face, mais je voudrais que cela fonctionne aussi étroitement que l’exemple des diapositives de la conférence.

MODIFIER

Cela a été corrigé dans une version bêta ultérieure de Swift – il y a maintenant l’option IBCollection dans le générateur d’interface.


Pour les premières versions bêta de Swift:

Je suis tombé sur le même problème: dans les notes de version de la bêta 2, vous trouvez la déclaration suivante:

Interface Builder ne prend pas en charge la déclaration des collections de points de vente dans les classes Swift

J’ai résolu ce problème de la manière suivante (facile à personnaliser):

 class CardGameViewController: UIViewController { @lazy var cardButtons : UIButton[] = { var tempBtn: UIButton[] = [] for v:AnyObject in self.view.subviews { if v is UIButton { tempBtn.append(v as UIButton) } } return tempBtn }() ... 

Fondamentalement, il parcourt toutes les sous-vues et vérifie s’il s’agit d’un UIButton. Dans ce cas, il est ajouté à un tableau temporaire. Ce tableau temporaire est ensuite utilisé pour instancier paresseusement le tableau cardButtons. Pour tous les détails, vérifiez: Matchismo: Objective-C to Swift

Mise à jour: Cela fonctionne correctement dans Xcode maintenant – “Outlet Collection” est l’une des options de connexion dans Interface Builder, qui crée quelque chose qui ressemble à:

 @IBOutlet var labelCollection: [UILabel]! 

Pendant que nous attendons un correctif, vous pouvez l’approcher en utilisant une propriété calculée. Disons que ma vue a cinq UILabels que je veux dans une collection. Je dois encore déclarer chacun d’eux, mais je déclare également une propriété calculée qui les collecte:

 class MyViewController { @IBOutlet var label1 : UILabel @IBOutlet var label2 : UILabel @IBOutlet var label3 : UILabel @IBOutlet var label4 : UILabel @IBOutlet var label5 : UILabel var labels: UILabel![] { return [label1, label2, label3, label4, label5] } 

Un peu ennuyeux, mais à partir de là, nous pouvons traiter la propriété labels comme s’il s’agissait d’une IBOutletCollection , et nous IBOutletCollection pas à changer le rest de notre code une fois le bogue corrigé:

 override func viewDidLoad() { super.viewDidLoad() for (index, item) in enumerate(self.labels) { item.text = "Label #\(index)" } } 

Utilisation:

 @IBOutlet var lineFileds : [UITextField]! 

Ensuite, faites glisser le lineFileds depuis les éléments TextField vers lineFileds dans l’ordre.

 @IBOutlet var buttons : [UIView]! 

puis faites-le glisser depuis l’inspecteur de connexions dans le générateur d’interface ou quel que soit le metod que vous utilisez habituellement pour cela

Je travaille dans Xcode seed 3 en utilisant cette syntaxe

 @IBOutlet strong var views: NSArray? 

Voir ma discussion ici: https://stackoverflow.com/a/24686602/341994

Suivez les étapes pour créer un tableau de points de vente et connectez-le avec IB Elements:

  • Créer un tableau d’IBOutlets
  • Ajoutez plusieurs UIElements (vues) dans votre interface Storyboard ViewController (comme illustré ci-dessous)
  • Sélectionnez ViewController (dans le storyboard) et ouvrez l’inspecteur de connexion
  • Il y a l’option ‘Outlet Collections’ dans l’inspecteur de connexion (Vous verrez un tableau de points de vente là-bas)
  • Connectez-vous avec vos éléments d’interface

 class ViewController2: UIViewController { @IBOutlet var collection:[UIView]! override func viewDidLoad() { super.viewDidLoad() } } 

entrer la description de l'image ici

Ce que dit @machine semble être l’état actuel (XCode 7.1) avec les liaisons iOS 9. La clé est de les faire glisser tous dans l’ordre. Utilisez le premier élément pour contrôler + glisser dans le code du contrôleur, puis modifiez le type de sortie en collecte. Une fois que le fichier de code du contrôleur a déplacé le sharepoint sortie sur chacun des contrôles de l’écran un par un dans l’ordre indiqué par @machine