cocoa - titulo - NSTabViewController ignorando las transiciones y la configuración de propagación de títulos
que poner en title (3)
Estoy intentando crear un panel de preferencias para mi aplicación utilizando guiones gráficos y la nueva clase NSTabViewController.
Puedo hacerlo funcionar, pero la configuración de transición en el guión gráfico parece ignorarse. Simplemente salta de una pestaña a otra, con el tamaño de la ventana cambiando instantáneamente.
Pensé que podría depender de si uso autolayout o no, pero no pareció cambiar el comportamiento de transición cuando lo activé.
También tengo la configuración ''Propagar título'' marcada. Esperaba que tomara la etiqueta del elemento de la pestaña, o el título del controlador de vista, y la propagara como el título de la ventana, pero no parece que lo haga.
¿Alguien tiene esto para trabajar?
Aquí hay una aplicación de ejemplo simple que estoy probando con: https://www.dropbox.com/s/roxaplxy5gtlqns/Again.zip?dl=0
Actualización: Tengo este trabajo gracias a Pierre. Terminé haciendo una buena ventana de preferencias de transición mediante la subclasificación de NSTabViewController de la siguiente manera:
@implementation MCPreferencesTabViewController
-(void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem
{
[super tabView:tabView willSelectTabViewItem:tabViewItem];
NSTabViewItem *currentTabItem = tabView.selectedTabViewItem;
currentTabItem.view.hidden = YES;
tabViewItem.view.hidden = YES;
NSWindow *window = self.view.window;
NSSize contentSize = tabViewItem.view.fittingSize;
NSSize newWindowSize = [window frameRectForContentRect:(CGRect){CGPointZero, contentSize}].size;
NSRect frame = [window frame];
frame.origin.y += frame.size.height;
frame.origin.y -= newWindowSize.height;
frame.size = newWindowSize;
[self.view.window setFrame:frame display:NO animate:YES];
}
- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
{
[super tabView:tabView didSelectTabViewItem:tabViewItem];
tabViewItem.view.hidden = NO;
}
@end
Debe hacer que el NSTabViewController sea el delegado de NSTabView.
En Interface Builder, controle y arrastre desde la vista de pestaña Sin sombra al controlador de vista de pestaña y establezca la salida de delegado.
Uno esperaría que Interface Builder configurara esto correctamente al crear un nuevo controlador de vista de pestañas. No es asi.
O en viewDidLoad()
para NSTabViewController
, incluye
self.tabView.delegate = self
Tenga en cuenta que esto fue así hasta Xcode 9. Desde Xcode 9, debe eliminar (o no agregarlo) esta línea:
self.tabView.delegate = self
De lo contrario, recibirá un error:
*** Assertion failure in -[YourApp.CustomTabView setDelegate:],
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1561.0.100/AppKit.subproj/NSTabView.m:2766
2017-10-25 19:29:06.301282+0200 YourApp[23106:5687795] Failed to set (contentViewController) user defined inspected property on (NSWindow):
A TabView managed by a TabViewController cannot have its delegate modified