2012-07-22 15 views
9

pregunta corta¿Qué puede hacer el "Objeto" en la Biblioteca de objetos de Storyboard?

Hay una cosa que se llama Object en la biblioteca de objetos de constructor de interfaces de XCode. Me pregunto qué tipo de tarea se puede lograr al usar este "Objeto".

Sea específico, es un NSObject en Storyboard (o xib). Se describe de la siguiente manera:

Proporciona una plantilla para los objetos que no están directamente disponibles en Interface Builder. Puede convertir este objeto en una instancia de cualquier clase utilizando el inspector de clases personalizado.

pregunta larga

Estoy tratando de construir un UITableViewController junto con una UISearchController. Como ambos requieren implementar UITableViewDelegate y UITableViewDatasource en su delegado, me gustaría poder asignar el delegado de UISearchController a un Objeto que no sea el UITableViewController Principal.

Estoy buscando una manera de lograr esto en Storyboard, en lugar de asignar manualmente el delegado en viewDidLoad. Especialmente, descubriendo cómo funciona el Object en Storyboard.

Entiendo que puedo distinguirlos mediante el examen de los padres de UITableView. Pero siempre es bueno separar la lógica en diferentes objetos. Será más fácil de implementar, mejor eficiencia, mejor estructurado y posible reutilización.

Gracias de antemano.

Lo que he tratado

  • Poner Object al mismo nivel de la UITableViewController en el guión gráfico (No se puede poner la Object dentro de otro UIViewController).
    Vincúlelo con @property (nonatomic, weak) IBOutlet NSObject * en el UITableViewController.
    El NSObject * resulta ser un puntero nil al imprimir en viewDidLoad. Sin suerte.
  • Al cambiar la propiedad a @property (nonatomic, strong), que se convierta en un lugar de UICustomObjectnil. Parece que estoy en el camino correcto.
+0

'Object' se utiliza para proporcionar un enlace de Interface Builder para sus clases personalizadas y sus entradas y salidas. – esqew

+0

Creo que lo estoy obteniendo. Intentando jugar. Gracias por el comentario. –

Respuesta

9

Como observa, Object hace que un objeto de cualquier clase, incluida su propia clase personalizada, se instancia cuando se carga el XIB/Storyboard. El hecho de que obtenga un UICustomObject indica que el mecanismo de carga de XIB/Storyboard no sabe qué clase debería ser el objeto o no puede encontrar la clase (mediante la búsqueda en tiempo de ejecución) que ha especificado.

La solución es asegurarse de especificar la clase correcta para el objeto en el inspector de clase personalizada:

enter image description here

Entonces, por supuesto, también hay que asegurarse de que el archivo de implementación para la clase de la pregunta está en su proyecto y está incluida en su objetivo.

Finalmente, es correcto usar strong para IBOutlet que apunta a su objeto personalizado, porque es un objeto de nivel superior y los objetos de nivel superior deben referenciarse utilizando las propiedades strong. (Si es realmente curioso, Mike Ash tiene una buena article sobre los detalles de la administración de memoria de salida XIB/Storyboard, incluidas las diferencias entre OS X e iOS en este sentido.)

+0

Gracias por esta buena explicación. Además de estos, también descubrí algunos hechos interesantes. 1. Dado que este objeto es creado por Storyboard en tiempo de ejecución, no es posible especificar ningún argumento para el inicializador. 2. El objeto en sí no se puede conectar a un segue o invoca uno, tiene que llamar al controlador de vista principal. –

+0

Querido @AndrewMadsen, es posible que sepas la respuesta a este ... http://stackoverflow.com/q/26043973/294884 ... ¡Lo adelgazo se relaciona con estos misteriosos objetos "Object" !! vítores ... – Fattie

5

Esta pregunta ha sido marcada como respondida, pero ya que es una pregunta abierta para la cual no puede haber múltiples respuestas, existe una técnica inteligente para hacer lo que usted dice - romper la funcionalidad en clases de roles individuales que el autor se refiere como "comportamientos":

http://www.objc.io/issue-13/behaviors.html

Lo esencial es que puede escribir un objeto que, por ejemplo, realice un efecto de paralaje exponiendo puntos de venta a múltiples vistas. Se establece como delegar la vista de desplazamiento y actualiza la otra vista en función de la configuración configurable. Como ha señalado, no puede pasar argumentos a un constructor, pero aún puede especificar parámetros a través del mecanismo de la ruta clave ilustrado en la imagen en la respuesta de @ Andrew.

Como también observó, puede encontrarse con el problema en el que le gustaría tener diferentes objetos que responden a eventos de desplazamiento, etc. El autor abordó esto codificando un simple multiplexor. También puede resolver esto con el patrón de cadena de responsabilidad: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern.

Y finalmente, @Andrew mencionó en su respuesta la importancia de almacenar el objeto como una propiedad fuerte. Ellos son los autores del artículo mencionado anteriormente, vamos a llamarlo "Krzysztof", proporciona una solución utilizando el mecanismo de objeto asociado obj-c para permitir la configurabilidad sin código. Su kilometraje puede muy bien con esto, y puede haber mejores opciones ahora con Swift, pero al menos, es una buena fuente de reflexión.

Cuestiones relacionadas