2013-10-11 10 views

risposta

21

Ecco una categoria UIStoryboard che farà proprio questo:

UIStoryboard + LDMain.h

#import <UIKit/UIKit.h> 

@interface UIStoryboard (LDMain) 

+ (instancetype)LDMainStoryboard; 

@end 

UIStoryboard + LDMain.m

#import "UIStoryboard+LDMain.h" 

UIStoryboard *_mainStoryboard = nil; 

@implementation UIStoryboard (LDMain) 

+ (instancetype)LDMainStoryboard { 
    if (!_mainStoryboard) { 
     NSBundle *bundle = [NSBundle mainBundle]; 
     NSString *storyboardName = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"]; 
     _mainStoryboard = [UIStoryboard storyboardWithName:storyboardName bundle:bundle]; 
    } 
    return _mainStoryboard; 
} 

@end 

Ecco un link to the gist

+1

Categorie di classi del framework dovrebbe sempre usare prefissi per evitare conflitti di nomi. –

+0

Grazie. Ho apportato le modifiche. –

+1

Fresco; i nomi dei metodi sono in realtà la parte più importante, però. –

12

Puoi utilizzare [UIStoryboard storyboardWithName:storyboardName bundle:bundle] se lo storyboard non è già stato caricato.

Se ha, tuttavia, questo caricherà una nuova copia.

È inoltre possibile utilizzare viewController.storyboard per ottenere quello esistente. Se si dispone di un numero mainWindow come delegato dell'applicazione (probabilmente lo si fa), è possibile ottenere lo rootViewController.storyboard di quello.

Qualcosa di simile:

UIApplication *application = [UIApplication sharedApplication]; 
MyAppDelegate *myAppDelegate = ((MyAppDelegate *)application).delegate; 
return myAppDelegate.mainWindow.rootViewController.storyboard; 

In caso contrario, questo potrebbe funzionare per voi:

UIApplication *application = [UIApplication sharedApplication]; 
UIWindow *backWindow = application.windows[0]; 
return backWindow.rootViewController.storyboard 
Problemi correlati