¿Cómo puedo crear una punta con una vista de clases asociada que puede ser utilizado por múltiples ViewControllers

StackOverflow https://stackoverflow.com/questions/2066539

Pregunta

Estoy abriendo una nueva pregunta durante el seguimiento en mi último ( supervista y nula parentviewcontroller después de añadir una vista secundaria ). Básicamente me sale que el uso de subvistas es una buena idea, pero que no debe tener un ViewController controlar una vista secundaria que vive dentro de otro ViewController. Básicamente me gustaría hacer lo siguiente ... Tengo dos ViewControllers que comparten una vista secundaria común. He creado que subvista como una semilla llamada SearchDate.xib. El propietario es un archivo de clase correspondiente SearchDateView.m / h. Esa clase tiene una salida para el único elemento en el interior del UIView en la punta que es una etiqueta. La clase SearchDateView también tiene una función para cambiar el valor de la etiqueta en el SearchDateView.xib. Me gustaría que mis dos ViewControllers a cargar esta semilla, pero al parecer no tengo ni idea de cómo cargar correctamente la punta. No importa lo que hago en mejores no se muestra nada y en el peor, se produce una excepción. Los documentos hablan de manzana arrastrando en otras instancias de clases de IB a la derecha en la vista principal, pero que parece no estar funcionando. Tengo una toma SearchDateView en mi ViewController y he intentado hacer esto en vista de la carga del controlador:

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0];
[[self view] addSubview:searchDateView];

Pero consigo esta excepción:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.'

Yo sé que estoy haciendo algo totalmente equivocado, pero ¿cuál es la manera correcta de tener una punta, clase de vista asociado que actualiza algunos de los objetos en esa semilla, y volver a utilizar esa semilla en diferentes controladores?

EDIT: Dado el comentario tal vez esto no era lo suficientemente claro. No quiero utilizar el mismo archivo semilla para una vista TODO - más bien una vista secundaria. Así, por ejemplo, controlador de A tiene un mapa y también una SearchDateView, y el controlador B tiene una vista de tabla y una SearchDateView. Así que me pregunto cómo cargar una vista secundaria en varios controladores ...

¿Fue útil?

Solución

No debe haber ningún problema con el mismo archivo SEMILLA para múltiples controladores cuando cada uno se inicializa utilizando initWithNibName: bundle :. Normalmente no cargue propio archivo punta del controlador desde dentro del controlador sin embargo.

Si se carga un archivo semilla usando loadNibNamed ::: continuación, se obtiene una NSArray con los objetos definidos en el mismo, por lo que no se puede utilizar como una visión directa. Una forma de obtener una vista es para buscar a través de la matriz usando para () o algo para encontrar el objeto que desee, pero si establece propietario: uno mismo, entonces debe conectarse a enchufes conectados a de propietario del archivo en sí mismo como del propietario del archivo será auto . Pero se puede descartar el valor de retorno en este caso; que no es necesario la matriz devuelta. Eso puede ser su principal problema (clobbering la salida de la matriz) si tiene esa salida conectado.

Es posible utilizar loadNibNamed para cargar un objeto de vista específico (suponiendo que lo saquen de la matriz devuelta), a continuación, mostrar de alguna manera, pero por lo general es más fácil de usar initWithNibName en el controlador (en este caso del propietario del archivo será el controlador).

Ah, y también puede establecer el archivo semilla para un controlador en el Interface Builder. No debería haber un problema con el uso de la misma semilla para múltiples controladores ya que esencialmente usted acaba de estar diciendo Interface Builder para configurar el archivo semilla para hacer algo como initWithNibNamed. Haga clic en el objeto controlador y comprobar la ventana de inspección.

Actualizar

probablemente haría esto con el fin de utilizar solamente un punto de vista en varios controladores:

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FooView" 
                                                 owner:self options:nil];
    for (id obj in nib)
        if ([obj isKindOfClass:[FooView class]])
            myNewView = (FooView *)obj;

(robado del Capítulo 8:. Las células 2 en el código de ejemplo de A partir iPhone 3 Desarrollo )

Se puede hacer esto con puntos de venta en IB, en cuyo caso se podría dejar de lado el bucle, pero es probable que necesite una superclase para ambos controladores declarando la salida, y algo que contar Interface Builder que el propietario del archivo es una instancia de esa superclase por lo que sabe acerca de la toma de corriente. Probablemente no vale la pena.

Otros consejos

  

Tengo una toma SearchDateView en mi ViewController y he intentado hacer esto en vista de la carga del controlador:

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0];
[[self view] addSubview:searchDateView];
     

Pero consigo esta excepción:

 *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.'

En ausencia de cacao Vinculaciones (que sólo está disponible en Cocoa, Cocoa Touch no), no creo que estos dos están relacionados.

En Xcode, añadir un punto de ruptura simbólica en objc_exception_throw, a continuación, ejecutar la aplicación en el depurador. Cuando se rompe, busque en la pila de llamadas. Podrás encontrar dónde se originó el problema realmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top