2011-09-23 8 views
14

Mam bardzo newbie pytanie o iOS ... Jeśli utworzyć nowy widok Based Application o nazwie TestForStackOverflow, Xcode automatycznie tworzy kod podobnego do TestForStackOverflowAppDelegate.h:Gdzie jest ustawiony Delegat aplikacji i kto inicjuje jego właściwości window i viewController?

@class TestForStackOverflowViewController; 

@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate> 

@property (nonatomic, retain) IBOutlet UIWindow *window; 

@property (nonatomic, retain) IBOutlet TestForStackOverflowViewController *viewController; 

@end 

i następujące w TestForStackOverflowAppDelegate. m:

#import "TestForStackOverflowAppDelegate.h" 

#import "TestForStackOverflowViewController.h" 

@implementation TestForStackOverflowAppDelegate 

@synthesize window = _window; 
@synthesize viewController = _viewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 

    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

[...] 

Nadchodzą moje pytania:

1) gdzie jest klasa TestForStackOverflowAppDelegate ustawiony jako delegat do bieżącej aplikacji? Czy dzieje się to "automagicznie"? Widziałem, że plik źródłowy main.m zawiera tylko następujący kod:

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

nie powinna utworzyć klasę delegata aplikacji w czwartym parametr wywołania funkcji UIApplicationMain?

2) gdzie są wyświetlane okno i widokWłaściwości kontrolera klasy TestForStackOverflowAppDelegate?

3) może to być trywialne, ale dlaczego mamy syntezować okno = _window, nie mając zmiennej instancji o nazwie _window w interfejsie TestForStackOverflowAppDelegate? Zauważyłem, że możesz zadeklarować @ właściwości bez posiadania odpowiednich iVars w interfejsach klas (być może są one automatycznie tworzone przez kompilator), ale czy jest to dobra praktyka, czy też powinieneś zawsze tworzyć odpowiednie iVary w swoich klasach?

Przepraszam za bardzo długą wiadomość, mam tylko nadzieję, że nie napisałem zbyt oczywistego pytania, ponieważ tutaj we Włoszech jest późna noc i jestem bardzo zmęczony ... ale kiedy te pytania przychodzą mi do głowy, mogę „t czekać na rozwiązanie :)

Odpowiedz

13

Jak ładuje się klasa delegatów aplikacji?

W twoim pliku -info.plist znajduje się klucz o nazwie "Główna nazwa pliku podstawowego stalówki" i ma widok podobny do MainWindow.xib. W tym pliku XIB znajduje się obiekt proxy właściciela pliku i ma on przypisany do klasy delegatów aplikacji.

Otwórz ten XIB w projektancie. Zwróć uwagę na obiekt właściciela pliku u góry, kliknij go kontekstowo i spójrz na obiekt delegata. Teraz spójrz na obiekty w projekcie poniżej linii (XCode 4) - powinieneś tam zobaczyć obiekt delegowania aplikacji.

Gdzie jest okno i viewController dla zestawu appDelegate?

Poszukaj w projektancie i kontekście kliknij obiekt delegata aplikacji pod linią (XCode 4). Okno i widok Cel kontrolera jest tam związany.

_window Ivar

To automatycznie dostarczane do Ciebie. Nie jest dla mnie jasne, czy jest to dziedziczone, czy generowane przez kompilator.

Oto więcej na _ Ivars: Why rename synthesized properties in iOS with leading underscores?

Jeśli zdecydujesz się zrobić odpowiednik w postaci kodu:

usuń plist odniesienia xib main.m: pass nazwisko delegata

int main(int argc, char *argv[]) 
{ 
    int retVal = UIApplicationMain(argc, argv, nil, @"HelloViewAppDelegate"); 

W delegacji aplikacji:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    CGRect screenBounds = [[UIScreen mainScreen] applicationFrame]; 
    CGRect windowBounds = screenBounds; 
    windowBounds.origin.y = 0.0; 

    // init window 
    [self setWindow: [[UIWindow alloc] initWithFrame:screenBounds]]; 

    // init view controller 
    _mainViewController = [[MainViewController alloc] init]; 

    [[self window] addSubview:[_mainViewController view]]; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

Ok ... Przeanalizowałem plik MainWindow.xib, oznaczony jako główny plik NIB w pliku plist, i widziałem, że ma on w nim określone obiekty, takie jak delegator aplikacji TestForStackOverflow i kontroler widoku TestForStackOverflow. Rozumiem, że są one połączone z odpowiednimi klasami, ale nie można tego zobaczyć od inspektora: inspektor odwołuje się do aplikacji AppFegStackOverflow App Delegate i nigdy nie klasy TestForStackOverflowAppDelegate .. Widzę odniesienia do "prawdziwych" klas tylko wtedy, gdy otworzę MainWindow .xib jako plik XML. BTW, zrozumiałem, gdzie się dzieje magia :) –

+0

Kolejna wątpliwość ... kiedy tworzę aplikację HelloWorld View Based, automatycznie tworzy się plik MainWindow.xib, który jest używany tylko dla cel wskazywania na klasy Delegata aplikacji i kontrolera widoku, prawda? Nie służy do rysowania interfejsu aplikacji, ponieważ w tym celu masz do dyspozycji plik HelloWorldViewController.xib, czy coś mi brakuje? Rozumiem, że mogą to być oczywiste pytania, ale próbuję zebrać wszystkie elementy układanki :) –

+0

W MainWindow.xib wystąpienie delegata aplikacji (poniżej linii) ma cel kontrolera widoku kontrolera viewController podklasy i Xib, które zostały dodane. W takim przypadku główne okno służyło tylko do załadowania. Można dodać MainWindow.m/h, który dziedziczy z UIViewController, i który mógłby być docelowym ViewController. Ale ... – bryanmac

3

1), aby być proste, kiedy UIApplicationMain() nazywa,

  • you aplikacja .plist zostanie znaleziony,
  • klucz "nazwa pliku główna baza stalówka" jest traktowana w górę,
  • ten XIB jest otwarty,
  • Obiekt, który obsługuje protokół UIApplicationDelegate jest tworzony i wykorzystywany jako delegata aplikacji

2) są ustawione w XIB, można je przeglądać, jeśli

  • otworzyć główne XIb,
  • wybrać obiekt AppDelegate,
  • otwórz inspektora Connections dla tego obiektu,
  • spojrzenie w sekcji Outlets

3) Masz rację, są one tworzone automatycznie przez kompilator. Dzięki temu kod staje się bardziej czytelny dzięki mniejszej liczbie wierszy i łatwiejszej refaktoryzacji, która ma tylko jedno miejsce, w którym deklarowana jest właściwość.

Mam nadzieję, że pomoże!

+0

Pewnie, że pomaga, dzięki! –

Powiązane problemy