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 :)
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 :) –
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 :) –
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