cocoa - NSViewController y mĂșltiples subvistas desde un Nib
interface-builder (2)
¿No debería ser MainViewController una subclase de NSWindowController? ¿Y las salidas en la clase conectadas para ver elementos en la ventana principal en MainMenu.xib? Esperemos que todavía se lean viejos hilos ...
Estoy teniendo dificultades para envolver mi cabeza al cargar vistas con Interface Builder y NSViewController.
Mi objetivo es tener una vista que cumpla con la siguiente descripción: Barra superior en la parte superior (como una barra de herramientas pero no exactamente) que abarca todo el ancho de la vista y una segunda "vista de contenido" a continuación. Esta vista compuesta es propiedad de mi subclase NSViewController
.
Tenía sentido usar Interface Builder para esto. He creado una punta de vista, y le agregué dos subvistas, las puse correctamente (con la barra superior y la vista de contenido). He configurado File''s Owner
para que sea MyViewController
y MyViewController
conectado salidas y MyViewController
.
Las vistas en las que deseo cargar (la barra y el contenido) también están en sus propias puntas (esto podría ser lo que me está fallando) y esas puntas tienen su Clase personalizada establecida en la subclase NSView respectiva, según corresponda. No estoy seguro de qué establecer como File''s Owner
(supongo que MyController
debería ser su propietario).
Por desgracia, cuando inicio una instancia de MyViewController
ninguna de mis plumillas se muestra. Lo agregué a la vista de contenido de mi ventana correctamente (he comprobado lo contrario), y en realidad, las cosas se cargan. Es decir, awakeFromNib
se envía a la vista de barra, pero no se muestra en la ventana. Creo que definitivamente tengo algunos cables cruzados en alguna parte. Tal vez alguien podría echar una mano para aliviar algo de mi frustración?
EDITAR un código para mostrar lo que estoy haciendo
El controlador se carga cuando mi aplicación termina de iniciarse, desde el delegado de la aplicación:
MyController *controller = [[MyController alloc] initWithNibName:@"MyController" bundle:nil];
[window setContentView:[controller view]];
Y luego en mi initWithNibName no hago nada más que llamar a super por ahora.
Al dividir cada vista en su propia punta y usar NSViewController
, la forma típica de manejar las cosas es crear una subclase NSViewController
para cada una de sus puntas. El propietario del archivo para cada archivo de plumilla respectivo se configurará en esa subclase NSViewController
, y usted conectará la salida de la view
a su vista personalizada en la plumilla. Luego, en el controlador de vista que controla la vista de contenido de la ventana principal, NSViewController
una instancia de cada subclase NSViewController
y luego agrega la vista de ese controlador a su ventana.
Un poco de código: en este código, estoy llamando al controlador principal de vista de contenido MainViewController
, el controlador de la "barra de herramientas" es TopViewController
y el resto del contenido es ContentViewController
//MainViewController.h
@interface MainViewController : NSViewController
{
//These would just be custom views included in the main nib file that serve
//as placeholders for where to insert the views coming from other nibs
IBOutlet NSView* topView;
IBOutlet NSView* contentView;
TopViewController* topViewController;
ContentViewController* contentViewController;
}
@end
//MainViewController.m
@implementation MainViewController
//loadView is declared in NSViewController, but awakeFromNib would work also
//this is preferred to doing things in initWithNibName:bundle: because
//views are loaded lazily, so you don''t need to go loading the other nibs
//until your own nib has actually been loaded.
- (void)loadView
{
[super loadView];
topViewController = [[TopViewController alloc] initWithNibName:@"TopView" bundle:nil];
[[topViewController view] setFrame:[topView frame]];
[[self view] replaceSubview:topView with:[topViewController view]];
contentViewController = [[ContentViewController alloc] initWithNibName:@"ContentView" bundle:nil];
[[contentViewController view] setFrame:[contentView frame]];
[[self view] replaceSubview:contentView with:[contentViewController view]];
}
@end