2011-01-13 14 views
5

Bueno, "no conseguirlo" es demasiado duro; Lo tengo trabajando para lo que para mí es una configuración lógica, pero no parece ser lo que iOS considera lógico. Entonces no estoy obteniendo algodiseño de iOS; No lo estoy obteniendo

Supongamos que tengo una aplicación que muestra dos datos; una fecha y una mesa. De acuerdo con el enfoque de MVC tengo tres MVC trabajando aquí, uno para la fecha, uno para la mesa y otro que toma estos dos MCV y los convierte en una pantalla, cableándolos.

El maestro MVC sabe cómo y dónde quiere distribuir los dos sub MVC. Cada detalle MVC solo se ocupa de sus propios hijos dentro de los límites especificados por el maestro MVC. Algo así como:

- (void)loadView { 
    MVC* mvc1 = [[MVC1 alloc] initwithFrame:...] 
    [self.view addSubview:mvc1.view]; 

    MVC* mvc2 = [[MVC2 alloc] initwithFrame:...] 
    [self.view addSubview:mvc2.view]; 
} 

Si lo anterior es lógico (que es por mí), entonces yo esperaría cualquier clase MVC tiene un constructor "initWithFrame". Pero un MVC no lo hace, solo ver esto.

¿Por qué?

¿Cómo se distribuirán correctamente los MVC anidados? (Naturalmente, no tengo sólo estos dos, pero el detalle los AT tienen los AT sub otra vez.)


Gracias a todos por responder. Estudiaré los enlaces que se proporcionaron.

Déjame intentar explicar mi problema una vez más, con suerte para hacerlo más claro. Tenga en cuenta que ya me di cuenta de que mi vista no coincide con la de iOS, ya que no me gusta a dónde va mi código.

Sí, estoy llamando a un UIViewController un "MVC", ya que para mí, en este momento, implementa todos los aspectos de un MVC; tiene un código de controlador y una vista incrustada, además el controlador generalmente también contiene y proporciona los datos (todos los ejemplos de TableView lo implementan de esta manera).

MVC puede estar presente en muchos niveles; básicamente un UITextField podría (¿debería?) ser un MVC; hay una vista, pero también la lógica del controlador implica que no desea mezclar con otro código. Encapsulación Por ejemplo: Swing JTextField de Java tiene un MVC. Lo mismo ocurre con JTable, JList, ... Varios patrones MVC anidados en otros MVC para construir una pantalla completa.

Esto es lo que espero cuando alguna plataforma dice que usa el patrón MVC. Entonces, cuando codifiqué la tabla, creé un MVC y solo envié el mensaje loadData con una fecha como parámetro. Necesita encargarse del resto mismo. Tengo un MVC detallado que puede deslizarse; Luego le digo el objeto que necesita mostrar y tiene que encargarse del resto. Encapsulación

Tengo muchos UIViewControllers con UIViews incrustado. Y esa no es la manera de hacerlo ...

+0

¿De qué se trata este objeto ** MVC **? ¿Te refieres a UIViewControllers? –

+1

Primero, solo tienes 1 MVC. A menos que la tabla haga referencia a un conjunto de datos CoreData, e incluso entonces estoy seguro de que solo tienes 1 MVC. Lo dijiste tú mismo = 1 Vista, con fecha y tabla. Cada una de estas 'subvistas' se puede controlar en el controlador principal. [Vea este tutorial.] (Http://www.macresearch.org/cocoa_for_scientists_part_ix_mvc_is_not_the_motor_vehicle_commission) –

+0

@Tbee, aquí hay un [mejor artículo de Apple.] (Http://developer.apple.com/library/mac/#documentation /General/Conceptual/DevPedia-CocoaCore/MVC.html) Tiene imágenes sobre las cosas de MVC. –

Respuesta

3

Si entiendo su pregunta, y puede que no, vea mis comentarios sobre ella, creo que está aplicando el patrón de diseño MVC de forma demasiado granular. Más comúnmente en la configuración que describe, tendrá un único modelo, un solo controlador y múltiples vistas agrupadas/combinadas, como en un archivo .xib.

En términos de Cocoa Touch tendría una UIView que contiene un UILabel con la fecha y una UITableView para su tabla. Estas son tus Vistas.

Seguramente tendrá un modelo para los datos de la tabla, probablemente una matriz de datos. Sus datos de fecha pueden ser de su propio modelo si se trata de una fecha recuperada de algo o calculada o lo que sea, algo completamente separado de la matriz de datos.Si, en cambio, está asociado a los datos de la matriz, ambos se extraen de una base de datos, o la fecha se calcula a partir de los datos de la matriz, o lo que sea, entonces usted tiene un único Modelo.

Si todos los datos provienen de un único modelo, entonces es probable que un solo controlador funcione correctamente. Incluso si los datos provienen de más de una fuente/modelo, es probable que solo necesite/desee un controlador en esta configuración. El UITableView tendrá un UITableViewController, y ese mismo controlador también puede proporcionar su fecha.

En resumen, el patrón de diseño de Model View Controller no requiere tener un conjunto de conjuntos anidados de modelos, vistas y controladores. Podrían serlo, y proyectos suficientemente complejos pueden exigirlo. Sin embargo, en términos generales, tendrá un controlador asociado con un modelo y una o más vistas, y ese conjunto de objetos funciona en conjunto para proporcionar una pieza de funcionalidad.

0

Tbee,

voy a publicar un pequeño ejemplo de código aquí, ya que parece que no está realmente conseguirlo.

@interface MyView : UIView 

@property (retain) IBOutlet UIButton *button1; 
@property (retain) IBOutlet UIButton *button2; 

@property (assign) bool myData; 

-(IBAction) doButton1:(id)sender; 
-(IBAction) doButton2:(id)sender; 

@end; 

@implementation MyView 

@synthesize button1 = _button1; 
@synthesize button2 = _button2; 
@synthesize myData = _myData; 

// I'm leaving out the initWithNib, viewDidLoad, etc. 

- (IBAction) doButton1:(id)sender 
{ 
    // do something as a result of clicking button1 
    _myData = YES; 
} 

- (IBAction) doButton2:(id)sender 
{ 
    // do something as a result of clicking button2 
    _myData = NO; 
} 

@end 

Conecta eso en InterfaceBuilder, y tienes un "MVC" de trabajo. No necesita un UIViewController completamente nuevo para cada botón. El de la Vista se encarga de eso.

UITableView y las Vistas asociadas son más complejas, y pueden requieren un UIViewController adicional para ayudar a encapsular. Realmente no sugiero comenzar usándolos, pero este es un good tutorial here. Tiene a lot of images que le mostrará cómo conectar cosas en IB y similares. Es viejo, por lo que su XCode puede no parecerse a las imágenes, pero ayuda.

8

Otro enlace potencial es la gran charla de WWDC 2010 en MVC.

http://developer.apple.com/videos/wwdc/2010/

Es Sesión 116 - Modelo-Vista-Controllr para iPhone OS

La sesión está lleno de consejos prácticos sobre cómo MVC realmente funciona, lo que la hace funcionar, por eso es bueno. Pero también tiene muchas cosas de introducción para ayudar a la gente nueva en el concepto a entenderlo.

Si entiendo tu oración en las clases de Swing de Java anteriores, ¿estás hablando de las clases anónimas que responden a los eventos? Si es así, esos no son "MVC", son lo que se denomina 'Observadores', cuando observan un evento desde la vista que toman alguna acción (por lo general, envían un mensaje a un controlador). Cocoa Touch usa el paradigma de Objetivo/Acción (y delegación) para lograr esto.

También te sugiero que tomes los consejos de Matthew y Stephen y escribas un montón de código. Si no construyes esa base de intuición, hacer la pregunta correcta (que es la mayor parte de lo que se necesita para obtener una buena respuesta) es muy difícil.

Realmente creo que la charla de WWDC 2010 ayudará.

¡Buena suerte!

0

Gracias por los enlaces, voy a investigar sobre ellos.

Hasta ahora he reescrito la mayor parte de mi aplicación para usar vistas en lugar de viewcontrollers (excepto el topevel ​​uno) y comienza a coincidir con las llamadas API que están disponibles como layoutSubviews.Lo que me parece preocupante que tengo que hacer esto ahora:

[tableDataSource loadData:date]; 
[tableView reloadData]; 

Cuando en mi configuración anterior único que hice fue:

[tableViewController loadData:date]; 

Pero al parecer, esa es la manera de hacerlo. Una cosa no está clara para mí ATM. Como construyo y diseño la vista en loadView en mi AppViewController, ¿cómo se relayouted si cambia la orientación? El VC no tiene un layoutSubviews, entonces ¿debería usar didRotateFromInterfaceOrientation y reposicionar las subvistas desde allí?

BTW, no estoy mezclando el registro de clases internas anónimas como oyentes (observadores). Tengo mucha experiencia en la escritura de componentes Swing y controles JavaFX. Y ese es probablemente el culpable, en Java (FX), cada componente tiene una vista y un controlador (no siempre es un modelo).

Cuestiones relacionadas