web-dev-qa-db-fra.com

Swift - équivalent IBOutletCollection

J'essaie de reproduire le jeu Stanford Matchismo de "Développement d'applications ios7 pour iphone et ipad" dans iTunesU dans Swift.

À la page 77 de la 3e conférence slides , 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 de IBOutlet, mais je ne peux pas comprendre comment faire pour que Interface Builder connecte plusieurs prises au même IBOutlet/IBOutlet Tableau.

Quelqu'un a-t-il déjà compris comment procéder?

Je sais que je peux créer 12 points de vente et y faire face de cette façon, mais j'aimerais que ce travail soit aussi proche que possible de l'exemple des diapositives de la conférence.

48
Alcanzar

MODIFIER

Cela a été corrigé dans une version bêta ultérieure de Swift - il y a maintenant dans 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 trouverez la déclaration suivante:

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

J'ai résolu cela 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 si l'une est 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

9
apotry

pdate: 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, mais je déclare également une propriété calculée qui les recueille:

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'un IBOutletCollection, et nous n'aurons pas à modifier le reste de notre code une fois le bogue corrigé:

override func viewDidLoad() {
    super.viewDidLoad()

    for (index, item) in enumerate(self.labels) {
        item.text = "Label #\(index)"
    }
}
80
Nate Cook

Utilisation:

@IBOutlet var lineFields: [UITextField]!

Ensuite, faites glisser-déplacer les éléments UITextField vers lineFields dans l'ordre.

21
machine
@IBOutlet var buttons : [UIView]!

puis faites-le glisser depuis l'inspecteur de connexions dans le générateur d'interface ou le métod que vous utilisez habituellement pour cela

13
ZiggyST

Suivez les étapes pour créer un tableau de prises et le connecter à IB Elements:

  • Créer un tableau d'IBOutlets
  • Ajoutez plusieurs UIElements (vues) dans votre interface Storyboard ViewController (comme illustré dans l'instantané 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()
    }
}

enter image description here

4
Krunal

J'ai obtenu ce travail dans Xcode seed 3 en utilisant cette syntaxe

@IBOutlet strong var views: NSArray?

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

2
matt

Ce que @machine a dit semble être l'état actuel (XCode 7.1) avec les liaisons iOS 9. La clé est de les faire glisser dans l'ordre. Utilisez le premier élément pour contrôler + faire glisser dans le code du contrôleur, puis modifiez le type de sortie en collection. Après le fichier de code du contrôleur, faites glisser le point de sortie sur chacun des contrôles d'écran un par un dans l'ordre (comme le dit @machine)

1
Krams