2009-08-12 8 views
7

Estoy diseñando una aplicación de cuestionario simple. La aplicación necesita mostrar diferentes tipos de cuestionarios. Cada tipo de cuestionario tiene un comportamiento distinto y una IU.diseño de subvista de iPhone (UIView vs UIViewController)

La interfaz de usuario será algo como esto: alt text http://dl.getdropbox.com/u/907284/Picture%201.png

Me gustaría ser capaz de diseñar cada tipo de QuizQuestion en Interface Builder.

Por ejemplo, un MultipleChoiceQuizQuestion se vería así: alt text http://dl.getdropbox.com/u/907284/Picture%202.png

Originalmente, tenía planeado hacer la clase QuizQuestion un UIViewController. Sin embargo, leí en la documentación de Apple que UIViewControllers solo debería usarse para mostrar una página completa.

Por lo tanto, hice mi QuizController (que administra toda la pantalla, por ejemplo, botones previos/siguientes) un UIViewController y mi clase QuizQuestion una subclase de UIView.

Sin embargo, se debe cargar este UIView (creado en IB), debo hacer lo siguiente en mi constructor [1]:

//MultipleQuizQuestion.m 
+(id)createInstance { 
    UIViewController *useless = [[UIViewController alloc] initWithNibName:@"MultipleQuizQuestion" bundle:nil]; 
    UIView *view = [[useless.view retain] autorelease]; 
    [useless release]; 
    return view; // probably has a memory leak or something 
} 

Este tipo de acceso no parece ser estándar o orientado a objetos. ¿Este tipo de código es normal/aceptable? ¿O hice una mala elección en algún lugar de mi diseño?

Gracias,

de edición (para mayor claridad): Me gustaría tener una clase separada para controlar el multipleChoiceView ... como un ViewController pero al parecer eso es sólo para las ventanas enteras. Tal vez debería hacer un MultipleChoiceViewManager (¡no el controlador!) Y configurar el propietario del archivo en su lugar.

Respuesta

5

Estás en el camino correcto. En su QuizController xib, puede crear vistas separadas arrastrándolas a la ventana principal de xib en lugar de a la vista principal de QuizController. Luego puede diseñar cada vista que necesita de acuerdo con sus tipos de preguntas. Cuando el usuario toque el siguiente o el anterior, elimine la vista anterior y cargue la vista que necesita en función de su tipo de pregunta usando -addSubview en la vista principal del controlador de vista y realice un seguimiento de qué subvista se muestra actualmente. Intentar algo como esto:

[currentView removeFromSuperView]; 

switch(questionType) 
{ 
    case kMultipleChoice: 
     [[self view] addSubview:multipleChoiceView]; 
     currentView = multipleChoiceView; 
     break; 
    case kOpenEnded: 
     [[self view] addSubview:openEndedView]; 
     currentView = openEndedView; 
     break; 
// etc. 
} 

Dónde vista opción múltiple y openEndedView son salidas UIView en su QuizController conectado a los puntos de vista que diseñó en el IB. Es posible que necesite meterse con la posición de su vista dentro de la vista principal antes de agregarla para que se muestre en el lugar correcto, pero puede hacerlo con llamadas a -setBounds/-setFrame y/o -setCenter en la UIView .

+0

Gracias, pero me gustaría tener una clase separada para controlar el MultipleChoiceView ... como un ViewController, pero aparentemente eso es solo para ventanas enteras. Tal vez debería hacer un MultipleChoiceViewManager (¡no el controlador!) Y configurar el propietario del archivo en su lugar. – tba

+0

Creo que te lo estás haciendo más difícil hacerlo de esa manera. La delegación es lo que debe usar independientemente, por lo tanto, su decisión depende del lugar donde desee su código, en su propia clase o en la clase de controlador de vista donde se utilizará. Obviamente, depende de usted, pero no creo que gane nada colocándolo en su propia clase. Atentamente. –

0

Sí, IB on iPhone realmente quiere que File's Owner sea una subclase UIViewController, lo que hace que lo que quiera sea un poco complicado. Lo que puede hacer es cargar la punta contra un UIViewController existente en lugar de crear instancias de un solo uso de la punta:

@implementation QuizController 

- (void) loadCustomViewFromNib:(NSString *)viewNibName { 
    (void)[[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil]; 
} 

@end 

Eso hará que el tiempo de ejecución para cargar la punta, pero en lugar de crear un nuevo controlador de vista para conectar las acciones y puntos de venta utilizará lo que pase como propietario. Como pasamos el auto en la vista definida en ese plumín se adjuntará a cualquier IBOutlet al que se lo haya asignado después de la llamada.

+0

Gracias es un fragmento útil – tba

Cuestiones relacionadas