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é.
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
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
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