2012-04-12 15 views
9

Después de perder el tiempo con las aplicaciones de iOS, pensé que daría un giro a la aplicación Cocoa suponiendo que las cosas serían muy similares. Así que tengo una aplicación de ventana única con una vista dividida y algunos NSTableView s (creo que iTunes) y estoy buscando un lugar para poner mi código que buscará datos de la web para llenar las tablas.(Cocoa) ¿Cuál es el equivalente de una subclase UIViewController en una aplicación de cacao de una sola ventana?

En iOS pondría esto en el método viewDidLoad de la subclase UIViewController apropiada. El UITableViewDataSource accedería a estos datos para poblar sus celdas.

Ahora tengo un NSWindow para el que podría hacer algo similar, pero ¿cómo puedo hacer un NSWindowController para ello? ¿Esto es incluso lo que quiero? Podría ponerlo en el AppDelegate pero no parece correcto.

Respuesta

12

La diferencia entre iOS y OS X es que sólo hay una ventana en IOS, pero no puede haber múltiples en OS X. NSViewControllers en OS trabajo X de manera diferente que UIViewControllers en que el NSViewController está diseñado para cargar y manejar una sola vista, mientras que UIViewControllers (disculpas por mi relativa falta de conocimiento de iOS) parecen manejar múltiples vistas y proporcionar mucho más del pegamento entre las vistas.

Incluso el Apple docs escriben que:

En Mac OS X, los controladores de vista AppKit son asistentes al controlador de ventana , que es en última instancia responsable de todo lo que pasa en la ventana.

Por lo tanto, la contraparte de UIViewController en OS X no es NSViewController, sino más bien NSWindowController, que sí contempla la OS X mucho más de lo que lo hace UIViewController para iOS mediante la gestión de la totalidad de una ventana individual y el diseño/contenido/interacción de las vistas dentro

En su caso, yo usaría un NSWindowController - aunque si la aplicación es muy simple, el App Delegate también funciona; y si la aplicación es muy compleja, usar un NSViewController para dividir el código no sería una mala idea.

La mejor manera de hacer uso de un NSWindowController sería cargar mediante programación en la App Delegado usando [[CustomWindowController alloc] init] y

@implementation CustomWindowController 
- (id)init 
{ 
    self=[super initWithWindowNibName:@"CustomWindowNibName"]; 
    if(self) 
    { 
     //perform any initializations 
    } 
    return self; 
} 
@end 

O llamando

[[CustomWindowController alloc] initWithWindowNibName:@"CustomWindowNibName"]; 

directamente (y anulando initWithWindowNibName) si desea es reutilizable

Y puede eliminar la ventana predeterminada en MainMenu.xib.


Fundamentalmente, más a menudo que no, un NSWindowController gestiona una ventana de instancia en su propio archivo semilla. El NSWindowController generalmente posee ese archivo de punta. (Aunque es posible hacer que administre una ventana creada mediante programación, generalmente no es así como se hace).

Para poder usar un NSWindowController personalizado, necesita por lo tanto hacer que su ventana sea administrada en un archivo nib/xib por separado.(El uso del archivo xib predeterminado significa que permite a Cocoa crear una instancia automática de NSWindowController sin posibilidad de crear subclases; no puede usar un NSWindowController personalizado con el NSMainNibFile predeterminado. Para una aplicación simple, simplemente coloque todo el código del controlador en la aplicación NSA/delegado de la aplicación)

en Xcode 4, al menos, el proceso implica la creación de un xib con la plantilla de la ventana y la clase personalizada NSWindowController, crear instancias de la clase CustomWindowController basado en que la semilla en -init o donde sea y luego llamar [CustomWindowController showWindow:self]; (o si eso no lo hace trabajo, -makeKeyAndOrderFront:) para mostrar la ventana (en - (void)applicationDid/WillFinishLaunching:(NSNotification *)aNotification podría ser un buen lugar).

Para evitar que la ventana predeterminada muestre Solo la elimino. Probablemente haya una mejor manera, pero no lo sé.

+0

Sí, pensé que necesitaba usar un NSWindowController pero no estaba seguro de cómo conectarlo a NSWindow. Arrastré una nueva ventana al MainMenu.xib y lo configuré, pero ya se está cargando cuando ejecuto la aplicación. También intenté usar AppDelegate solo para comenzar, pero no sé cómo, por ejemplo. hacer que mi NSTableView se vea en AppDelegate.m para los métodos del prototipo NSTableViewDataSource. Intenté conectarme desde la tabla al 'Propietario del archivo' y seleccioné el origen de datos pero falló con un error 'fuente de datos de vista NSTable inválida'. – TijuanaKez

+0

La manera más fácil de conectar NSWindowController es dividir los archivos de punta y darle su propio archivo para cargar. Por lo tanto, cree un nuevo archivo de punta utilizando la plantilla de ventana y establezca el Propietario de archivos en el controlador. Además, sobre su intento de conectarse a dataSource: 'Propietario del archivo' en ese caso era la aplicación NSA; desea arrastrar al delegado de la aplicación en su lugar. – Vervious

+0

Ok, así que hice un nuevo controlador 'MainWindowController' y marqué 'con el archivo xib'. Copié NSwindow desde MainMenu.xip y lo pegué en el nuevo archivo MainWindowController.xib eliminando el antiguo. La 'Clase personalizada' del propietario del archivo está configurada en MainWindowController. Agregué el método de inicio personalizado a MainWindowController.m con 'self = [super initWithWindowNibName: @" MainWindowController "];'. Instalo mi propiedad MainWindowController en el método delegado de la aplicación 'applicationDidFinishLaunching' con' mainWindow = [[MainWindowController alloc] init]; '.. sin errores, pero sin ventana. ¿Algo que me haya perdido? – TijuanaKez

Cuestiones relacionadas