2010-12-05 9 views
29

Quiero hacer una matriz con un montón de UIImageViews que tengo en Interface Builder. En lugar de tener 20 o 30¿Cómo hacer que IBOutlet salga de una matriz de objetos?

IBOutlet UIImageView *img1; 

y les une todo ese camino, y luego ponerlos en una matriz, ¿hay una manera de declarar una matriz de IBOutlet UIImageViews?

Así que no tengo tantas declaraciones en mi archivo de encabezado.

Respuesta

40

Es posible, que se llama colección de salida. Esta es la manera de definir una colección de salida:

@property(retain) IBOutletCollection(UIImageView) NSArray *images; 

Ahora usted puede pegar más de un objeto en el punto de venta en el Interface Builder, la matriz se creará para usted cuando se carga la interfaz.

+7

Me tomó bastante tiempo encontrar la forma de "pegar más de un objeto en la toma de corriente" en xcode 4. Después de crear IBOutletCollection en el código, esperaba poder arrastrar con CTRL desde UIImageView. Esto no funciona, por alguna razón. Lo que sí funciona es seleccionar el 'Propietario del archivo', luego abrir el 'Inspector de conexiones', luego arrastrar desde la sección 'Colecciones de salida' a cada UIImageView por turno. –

+0

No pude encontrar la manera de implementar esto, gracias @BenClayton! – guptron

+0

En la vista previa del desarrollador de xcode 5, parece que se resuelve el problema que @BenClayton mencionó: CTRL-Drag ahora funciona para enlazarse a la matriz. Buena respuesta aquí! –

-4

There.s no, por desgracia, pero se puede mantener todas las declaraciones en una sola línea:

IBOutlet UIImageView *img1, *img2, *img3, *img4; 

La otra opción (probablemente el mejor, ya que tiene muchos de estos) sería la creación de ellos mediante programación y almacenarlos en una matriz, a continuación, agregarlos a la vista desde el punto de vista de clase del controlador, utilizando, para cada uno,

[self.view addSubview:img]; 

Además, tenga en cuenta que si los elementos son estáticos (como elementos de fondo), y se realmente no necesita acceder a ellos, no necesita declarar puntos de venta para cada uno; solo puede agregarlos al archivo de punta y olvidarse de ellos.

Lo mismo ocurre con las instancias UIButton. Si no es necesario cambiar nada sobre el botón, se puede acceder a él desde el método que llama, así:

-(IBAction) buttonPressed:(id)sender { 
    UIButton *button = (UIButton *)sender; 
    // method guts 
    // stuff with button -- access tag, disable, etc 
} 
+0

me gustaría crear mediante programación, pero todos ellos necesitan para ir en ciertos lugares, y no quiero tener que establecer dónde poner cada uno. Y necesito cambiarlos de oculto a no oculto en ciertos momentos, así que necesito poder acceder a ellos. La declaración de línea única lo hará lucir más ordenado al menos. – Marty

+0

Sí, no tenemos enlaces de cacao en el iPhone, así que esto es realmente lo mejor que podemos hacer. ¿Respondió esto a la pregunta? –

4

Llego un poco tarde aquí, pero puede ser más fácil establecer la propiedad de etiqueta de cada ImageView en IB, luego acceda a ellas como [some_superview viewWithTag:tag] en lugar de mantener un identificador separado para cada una.

2

Swift 3 y superiores:

@IBOutlet var stuckLabels: [UIImageView] 
0

Aquí es la manera más fácil de hacerlo.

Siga estos pasos para crear una matriz de puntos de venta de un conectarlo con IB elementos:

  • crear una matriz de IBOutlets
  • Añadir múltiples UiElements (Visto) en su interfaz de Storyboard ViewController
  • Seleccionar ViewController (En el guión gráfico) e inspector de conexión abierta
  • Hay una opción 'Colecciones de salida' en el inspector de conexión (Verá una matriz de puntos de venta allí)
  • Conecte si con los elementos de la interfaz

-

class ViewController2: UIViewController { 


    @IBOutlet var collection:[UIView]! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

enter image description here

Cuestiones relacionadas