Swift-IBOutletCollection equivalente
interface-builder (7)
Conseguí esto trabajando en Xcode Seed 3 usando esta sintaxis
@IBOutlet strong var views: NSArray?
Vea mi discusión aquí: https://stackoverflow.com/a/24686602/341994
Estoy intentando replicar el juego Stanford Matchismo de "Desarrollo de aplicaciones ios7 para iphone y ipad" en iTunesU en Swift.
En la página 77 de las slides de la tercera conferencia, se muestra el uso de una IBOutletCollection
que no es una opción en Swift. El ejemplo de Swift doc muestra un ejemplo que tiene una matriz de IBOutlet
, pero no puedo averiguar cómo hacer que Interface Builder conecte múltiples salidas a la misma IBOutlet
/ IBOutlet
.
¿Alguien ha descubierto cómo hacer esto todavía?
Sé que puedo crear 12 puntos de venta y manejarlo de esa manera, pero me gustaría que esto funcione lo más cerca posible del ejemplo en las diapositivas de la clase.
EDITAR
Esto se solucionó en una versión Beta posterior de Swift: ahora hay la opción IBCollection en el generador de interfaces.
Para los primeros lanzamientos Beta de Swift:
Encontré el mismo problema: en las notas de la versión Beta 2 se encuentra la siguiente declaración:
Interface Builder no admite la declaración de colecciones de outlet en clases Swift
Resolví esto de la siguiente manera (fácil de personalizar):
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
}()
...
Básicamente, recorre todas las subvistas y verifica si uno es un UIButton. En ese caso, se agrega a una matriz temporal. Esta matriz temporal se usa para crear una instancia perezosa de la matriz cardButtons. Para todos los detalles, verifique: Matchismo: Objective-C to Swift
Lo que dijo @machine parece ser el estado actual (XCode 7.1) con enlaces de iOS 9. La clave es arrastrarlos a todos en orden. Use el primer elemento para controlar y arrastrar en el código del controlador y luego cambie el tipo de Salida a colección. Después de desde el archivo de código del controlador, arrastre el punto de salida a cada uno de los controles de la pantalla uno por uno en orden (como dice @machine)
Siga los pasos para crear una serie de puntos de venta y conectarlo con los elementos de IB:
- Crear una matriz de IBOutlets
- Agregue múltiples UIElements (Vistas) en su interfaz de Storyboard ViewController (como se muestra en la siguiente instantánea)
- Seleccione ViewController (en el guión gráfico) y abra el inspector de conexión
- Hay una opción ''Colecciones de puntos de venta'' en el inspector de conexiones (verá una serie de puntos de venta allí)
- Conecta si con los elementos de tu interfaz.
-
class ViewController2: UIViewController {
@IBOutlet var collection:[UIView]!
override func viewDidLoad() {
super.viewDidLoad()
}
}
Utilizar:
@IBOutlet var lineFields: [UITextField]!
Luego, arrastre y arrastre los elementos de lineFields
a lineFields
en orden.
Actualización: esto funciona correctamente en Xcode ahora - "Outlet Collection" es una de las opciones de conexión en Interface Builder, que crea algo que se parece a lo siguiente:
@IBOutlet var labelCollection: [UILabel]!
Mientras esperamos una solución, puede aproximarse utilizando una propiedad calculada. Digamos que mi vista tiene cinco UILabels
que quiero en una colección. Todavía tengo que declarar cada uno, pero también declaro una propiedad computada que los recopila:
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] }
Algo molesto, pero a partir de entonces podemos tratar la propiedad de las labels
como si fuera una IBOutletCollection
, y no tendremos que cambiar el resto de nuestro código una vez que se solucione el error:
override func viewDidLoad() {
super.viewDidLoad()
for (index, item) in enumerate(self.labels) {
item.text = "Label #/(index)"
}
}
@IBOutlet var buttons : [UIView]!
luego arrástrelo desde el inspector de conexiones en el generador de interfaces o cualquier método que use habitualmente para eso