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.
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
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)"
}
}
Utilisation:
@IBOutlet var lineFields: [UITextField]!
Ensuite, faites glisser-déplacer les éléments UITextField vers lineFields
dans l'ordre.
@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
Suivez les étapes pour créer un tableau de prises et le connecter à IB Elements:
-
class ViewController2: UIViewController {
@IBOutlet var collection:[UIView]!
override func viewDidLoad() {
super.viewDidLoad()
}
}
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
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)