2013-05-22 20 views
58

Kiedy tworzę nową aplikację pojedynczy widok w Xcode 4.6 korzystając storyboard, widzimy, że główną funkcją tworzy nową aplikację korzystającą z delegata aplikacji tak:W jaki sposób XCode ładuje główny scenariusz?

return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class])); 

Jednak jeśli spojrzymy na MyAppDelegate.h i MyAppDelegate.m, nie ma nigdzie w kodzie, który odwołuje się do MainStoryboard.storyboard. Różni się to od wersji nieobejmującej scenariusza, w której można znaleźć wiersz kodu, który programowo ładuje plik końcówki.

Moje pytanie brzmi, w jaki sposób załaduje się scenorys? (Gdzie mam grzebać, żeby go znaleźć?)

Dzięki

Odpowiedz

69

Look w ustawieniach celem dla Projektu

enter image description here

Wskazówka głównym ustawieniem Storyboard.

Jeśli chciałbyś zrobić to samemu w kodzie, zrobiłbyś coś takiego.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; 
    UIViewController *vc = [storyboard instantiateInitialViewController]; 

    // Set root view controller and make windows visible 
    self.window.rootViewController = vc; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

Dzięki! To odpowiada na moje pytanie – agro1986

+0

Nie ma za co, jeśli tak, należy oznaczyć je jako zaakceptowane, aby zamknąć pytanie. –

+0

Zrobione! Nie wiedziałem, jak to zrobić :) – agro1986

7

Jest uruchamiany z UIMainStoryboardFile ustawienie z pliku Info.plist. Xcode tworzy następnie główne okno, tworzy swój pierwszy kontroler widoku i dodaje go do okna. Nadal można to zrobić w kodzie podobnym do .nib użyciu

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
UIViewController* initialView = [storyboard instantiateInitialViewController]; 
+0

dziękuję za kod! – agro1986

9

Daj wygląd do UIApplicationMain dyskusji:

Dyskusyjnego
Funkcja ta tworzy instancję obiektu aplikacji z podstawowej klasy i wystąpienie delegata (jeśli w ogóle) z danej klasy i zestawy delegata do wniosku. Ustawia także główną pętlę zdarzeń, w tym pętlę uruchamiania aplikacji i rozpoczyna przetwarzanie zdarzeń. Jeśli plik Info.plist aplikacji określa główny plik końcówki, który ma zostać załadowany, włączając w to klucz NSMainNibFile i poprawną nazwę pliku końcówki dla tej wartości, ta funkcja ładuje ten plik nib.

Kiedy UIApplicationMain jest wywoływana, plik plist zawierający wszystkie informacje o aplikacji jest załadowany:

enter image description here

Tak to "rozumie", że xib plik/storyboard musi się załadować.

+0

Dziękuję bardzo! – agro1986

3

Jeśli chcesz instancję z Swift

var storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
var vc : AnyObject! = storyboard.instantiateInitialViewController() 
self.window!.rootViewController = vc as UIViewController 
self.window!.makeKeyAndVisible() 
+3

Jeśli chcesz zainicjować scenorys w metodzie 'applicationDidFinishLoading' w' AppDelegate', musisz również utworzyć obiekt 'window'. Na przykład jak to 'window = UIWindow (frame: UIScreen.mainScreen(). Bounds)' –

+0

powinieneś użyć let zamiast var i użyć? zamiast ! (nawet jeśli jesteś tego pewien), nie ma prawdziwej kary –

0

Bit późno do partii, ale można dostać się do viewController z okna, jak pokazano poniżej

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

     var viewController = window?.rootViewController as? ViewController 
     if let viewController = viewController { 
      // do awesome stuff 
     } 

     return true 
    } 
} 
2

w Xcode, czytelna dla człowieka Informacje.Sekcja plist, który określa główne storyboard jest:

Main storyboard file base name

w postaci zwykłego tekstu, kluczem jest UIMainStoryboardFile:

<key>UIMainStoryboardFile</key> 
<string>Main</string> 
Powiązane problemy