2014-12-15 10 views
12

Ich versuche, ein Einstellungsfenster für meine App mithilfe von Storyboards und der neuen NSTabViewController-Klasse zu erstellen.NSTabViewController ignoriert Übergänge und Titelausbreitungseinstellungen

Ich kann es funktioniert, aber die Übergangseinstellung im Storyboard scheint ignoriert zu werden. Es springt nur von einem Tab zum nächsten, wobei sich die Größe des Fensters augenblicklich ändert.

Ich dachte, es könnte davon abhängen, ob ich Auto-Layout verwenden oder nicht, aber es schien nicht das Übergangsverhalten zu ändern, wenn ich es umschaltete.

Ich habe auch die 'propagates title' Einstellung aktiviert. Ich hatte erwartet, dass es die Bezeichnung des Tab-Elements oder den Titel des View-Controllers übernehmen und als Fenstertitel propagieren würde, aber das scheint es nicht zu tun.

Wer hat das zur Arbeit gebracht?

Hier ist ein einfaches Beispiel-App-I-Tests bin mit: https://www.dropbox.com/s/roxaplxy5gtlqns/Again.zip?dl=0

Update: Haben Sie diese Arbeiten durch Pierre. Am Ende ein schönes Übergang Einstellungen-Fenster machen von NSTabViewController Subklassen wie folgt:

@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 

Antwort

23

Sie müssen die NSTabViewController die Delegierten des NSTabView zu machen.

Ziehen Sie in Interface Builder den Befehl "Ziehen" von der Registerkarte "Keine Schatten" auf den Registerkarten-Controller und legen Sie den Delegiertenanschluss fest.

Es wäre zu erwarten, dass der Interface Builder dies beim Erstellen eines neuen Registerkartencontrollers korrekt einrichten würde. Es tut nicht.

+0

Direkt an. Wahrscheinlich hätte ich das nie gefunden. Vielen Dank! –

+0

Der alte und schlechte Xcode. VIELEN DANK!!!!!!!!!!!!!!!!!! – SpaceDog

+0

Das funktioniert nicht für mich. Hat sich etwas verändert? – user965972

1

Oder in viewDidLoad() für die NSTabViewController, umfassen

self.tabView.delegate = self 
1

Bitte beachten Sie, dass diese bis Xcode 9. Seit Xcode 9 zutraf müssen Sie entfernen (oder auch nicht hinzuzufügen) diese Zeile:

self.tabView.delegate = self 

andernfalls erhalten Sie eine Fehlermeldung an:

*** 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