2010-12-13 8 views
12

Hola a todos; Actualmente estoy refacturando un par de controladores de vista que comparten unos pocos métodos IBOutlet sy IBAction. Moví las declaraciones de salida y el método IBAction a una superclase, eliminándolas de las subclases.¿Cómo acceder a IBOutlets declarados en la superclase?

Ahora, cuando abro Interface Builder, me parece que no puedo ver las salidas o acciones declaradas en la superclase. Las conexiones todavía existen, ya que las conecté antes de la refactorización, pero están atenuadas. (Es importante tener en cuenta que las conexiones también FUNCIONAN, ya que mi acción se dispara al presionar un botón y mis salidas se modifican correctamente.)

La pregunta es, ¿cómo puedo obtener el constructor de interfaces para reconocer salidas de una superclase? ¿Es esto posible y, si no es así, qué recomiendan todos?

(Sólo por diversión, aquí está mi archivo de cabecera superclase :)

@interface TFMainViewController : UIViewController { 
    UIImageView *logoImage, *thinkfunImage; 
    UIButton *buyFullButton;   
} 

@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage; 
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton; 

-(IBAction) buyFullVersion; 

@end 

EDIT: en caso de que alguien se está preguntando, estoy usando Xcode 3.2.5 y IB, con el iOS 4.2 SDK.

+0

¿Alguna vez descubrió si esto es posible o no? Esperaba hacer lo mismo pero IB no parece reconocer la propiedad a menos que la vuelva a declarar en la subclase. – Rog

+0

alguna noticia sobre este artículo? Me encuentro aquí con el mismo problema, esta vez con la superclase de Installer Plugin (InstallerPane) que no es la mía, así que no puedo modificarla, ¡solo la documentación dice que debo conectar mi .xib a algunas propiedades de la superclase! ! ¿Cómo? –

Respuesta

18

No me di cuenta de que era posible conectarme a superclases en el constructor de interfaces hasta hace aproximadamente una hora. Como esta era la única pregunta que podía encontrar sobre cómo hacer esto, agregaré mi respuesta, aunque esta pregunta sea antigua. Mi respuesta es con respecto a Xcode 4, no Xcode 3.

Por lo que puedo decir, no puede conectarse a puntos de venta en una superclase usando el editor asistente, pero puede hacerlo haciendo clic en "Propietario del archivo" "en IB. Eso debería mostrar todas las salidas en Utilidades-> Inspector de Conexiones. Luego puede presionar Ctrl + clic en la salida en el inspector (hacer clic en el signo '+') y arrastrarlo a su vista en IB.

+1

Esta debería ser la respuesta aceptada. ¡Gracias! – NathanAldenSr

+1

O simplemente navegue con Cmd-Click hacia la superclase en el editor asistente, luego puede arrastrar desde la clase a IB o viceversa para conectar tomas o crear nuevas. –

1

Estoy bastante seguro de que IB solo mira la clase real que está utilizando para encontrar puntos de venta, y no en las superclases. Creo que la solución más fácil sería dejar las declaraciones de variable de instancia en la superclase, pero duplicar las líneas @property en cada subclase.

+0

En realidad, Interface Builder * listará * propiedades de superclases, pero se deben declarar en el archivo de encabezado (solo de la superclase), y la subclase debe importar ese encabezado (como dijo Kendall). – Brian

2

IB debería poder ver salidas de superclases, lo he hecho varias veces sin problemas. ¿Estás seguro de que estás importando la superclase correctamente (usando #import en lugar de @class)? IB necesita alguna forma de rastrear hacia la superclase.

+0

Kendall, echando un vistazo a la otra respuesta, ¿estás duplicando algo, o toda la declaración está en la superclase? Estoy usando '# import', y tengo acceso a las propiedades dentro de las subclases, así sé que la importación del encabezado funciona. –

+0

Acabo de crear un proyecto de prueba para esto, y no funciona. A partir de Xcode 7.x, IB solo muestra IBOutlet de la clase real declarada para un objeto, no las de sus superclases. –

+0

Estaba jugando con esto en Xcode 7.3 en Swift y todavía funciona bien. Pude tener un IBOutlet declarado en la superclase y arrastrarlo desde IB hasta IB o arrastrarlo desde IB hasta la toma de corriente para conectarlo. El editor Asistente no muestra la superclase en la sección Automático, pero puede navegar allí e IB muestra que la salida proviene de la subclase (que es técnicamente precisa). @SamRitchie: no duplique nada, solo tenga la salida en la superclase, no en la subclase. –

0

Estoy haciendo esto en XCode 3.2.6. Empecé con las tomas conectadas a una clase, y luego hice una subclase con salidas adicionales. Cuando cambié la clase Propietario del archivo a la subclase, IB mostró las salidas de superclase en gris. Cambié Propietario de archivo a la superclase, luego a la subclase y ahora todos los puntos de venta no aparecen atenuados.

0

La manera más simple: crear archivos de interfaz e implementación para su (s) subclase (s).
Ejemplo perfecto: Juggleware's impresionante ShadowButton Subclass de UIButton.

Asegúrese de crear los archivos .h & .m en su proyecto. NOTA: No es necesario #import los archivos de encabezado, ya que esto es simplemente una instancia de clase de UIButton.

En Interface Builder:

  1. Seleccione el elemento que la que se conecte.
  2. Ir a Utilidades ->Identidad inspector
  3. cambiar la clase a la subclase (o superclase). NOTA: es posible que deba escribir su nombre de subclase y presionar ENTER.

¡Ya ha terminado!

Incluso si usted ha declarado una clase básica (UIButton) como IBOutlet en el archivo de cabecera así ...

// YourViewController.h 

@interface YourViewController : UIViewController { 

IBOutlet UIButton *mybutton; 
} 

... la clase que haya configurado en el Interface Builder (ShadowButton) sobrescribirá ya que está en la capa de vista.

La mejor parte de este enfoque es que su código no tiene ningún problema de dependencia desordenado.

3

Alternar entre la superclase y la subclase en el inspector de identidad le permite conectar sus puntos de venta en todas las clases. El único problema que encontré es cuando intentas hacer esto con una UITableViewCell y su subclase. Quería volver a asignar las instancias predeterminadas textLabel y detailTextLabel a las etiquetas que creo en Interface Builder. La solución alternativa es crear etiquetas sustitutas y luego anular las captadoras para señalarlas.

11

La solución para el problema con el IBOutlet .. es cambiar el tipo de clase de la clase de base en el inspector de identidad

enter image description here

conectarse utilizando Control + arrastrar y soltar y

enter image description here

cambiarlo de nuevo a la clase hija

enter image description here

Esto funciona para mí

Por cierto: yo solía Xcode 6

+1

tengo el mismo problema. lo intenté con NSCollectionViewItem, así que puedo conectarme a textField, pero aún no funciona ... – pvinis

0

En el proyecto Actualmente estoy trabajando, tenemos un BaseViewController con un UIScrollView como IBOutlet y maneja apariencia eventos de teclado/desaparición y se desliza el contenido en consecuencia. Al principio, no podía conectarse a ese IBOutlet, que resolvió el problema como éste, que es similar a la respuesta de Sosily:

  • BaseViewController tiene un IBOutlet, llamado contentScrollView. Veo 5 puntos de venta conectados anteriormente, que son UIScrollViews en otra UIViewControllers, creados por personas que anteriormente trabajaron en el proyecto

  • intenté conectar mi UIScrollView como el contentScrollView. Aunque mi UIViewController es una subclase de BaseViewController, no puedo conectarlo.

  • He intentado conectar ya conectado UIScrollViews como contentScrollView. Aunque todos UIViewControllers son subclases de BaseViewController, no puedo conectarlos de nuevo, también. Entonces, comencé a buscar un truco.

  • He creado el mismo contentScrollViewIBOutlet en mi propia UIViewController, conectado a la scrollView mi propia contentScrollView salida y eliminado el que acabo de crear.

  • Ahora el scrollView está conectado como contentScrollView al propietario del archivo, pero el único contentScrollView pertenece al BaseViewController. Probado y verificado que los eventos del teclado se manejan correctamente.

0

me encontré con un problema similar con una superclase, pero fue debido a un error en Xcode (8.2) donde Interface Builder no muestra puntos de conexión en el inspector si esos puntos de venta han sido declarados con un _Nullable escriba la anotación para la compatibilidad de Swift.

El uso de nullable en el interior @ paréntesis de propiedad parece solucionar el problema.

Este error de Xcode parece afectar a las salidas en cualquier clase (es decir, no solo en las superclases).

0

Tuve el mismo problema, y ​​resulta que fue porque en la superclase había declarado IBOutlets como "_Nullable". Ejemplo:

@property (nonatomic, strong) IBOutlet UITableView *_Nullable mySuperTableView; 

Cuando quité la _Nullable, de repente el IBOutlets reapareció en IB y todo estaba bien de nuevo. (Solo los había establecido en _Nullable porque Xcode se quejaba de que "al apuntador falta un especificador de tipo de anulabilidad" ... (no sé por qué).)

Cuestiones relacionadas