2011-09-23 16 views
14

我對IOS非常新手的問題,應用程序...如果我創建一個新的查看基於應用程序調用TestForStackOverflow時,Xcode自動爲TestForStackOverflowAppDelegate.h創建這樣的代碼:您的應用程序委託集合以及初始化其窗口和viewController屬性的位置在哪裏?

@class TestForStackOverflowViewController; 

@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate> 

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

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

@end 

和TestForStackOverflowAppDelegate以下。 L:

#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; 
} 

[...] 

來到這裏,我的問題:

1)哪裏是TestForStackOverflowAppDelegate類集合爲代表當前應用程序?它是否「自動」完成?我看到的main.m源文件只包含 下面的代碼:

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

難道不應該設置應用程序委託類在UIApplicationMain函數調用的第四個參數?

2)在哪裏設置了TestForStackOverflowAppDelegate類的window和viewController屬性? 3)這可能是微不足道的,但爲什麼我們有合成window = _window,而在TestForStackOverflowAppDelegate接口中沒有名爲_window的實例變量?我已經看到,你可以在類接口中聲明@properties而沒有相應的iVars(也許它們是由編譯器自動創建的),但是這是一種好的做法,還是應該總是在類中創建相應的iVars?

對不起,我只是希望我沒有寫出太明顯的問題,因爲在意大利這裏是深夜,我很累..但是當這些問題進入我的腦海時,我可以「T等待解決方案:)

回答

13

應用程序委託類是如何加載的?

在你的-info.plist文件中有一個名爲「Main nib file base name」的鍵,並具有類似於MainWindow.xib的視圖。在該xib文件中,有一個文件的所有者代理對象,並且它具有一個設置爲應用程序委託類的委託。

在設計器中打開XIB。注意頂部的File's Owner對象,上下文單擊它並查看委託對象。現在看下(XCode 4)行下面的設計中的對象 - 您應該在那裏看到應用程序委託對象。

appDelegate集的窗口和viewController在哪裏?

查看設計器和上下文單擊(XCode 4)行下面的應用程序委託對象。窗口和viewController目標綁定在那裏。

_window伊娃

它會自動爲你提供。不清楚它是由編譯器繼承還是生成。

這裏有更多關於高德​​_: Why rename synthesized properties in iOS with leading underscores?

如果你選擇了做在代碼中的等價物:

刪除廈門國際銀行的plist參考 的main.m:通過委託的名稱

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

在應用程序代理:

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

好的...我已經檢查了MainWindow.xib文件,它被引用爲plist文件中的主要NIB文件,並且我已經看到它有一些定義在其中的對象,例如TestForStackOverflow App Delegate和TestForStackOverflow View Controller。 。我明白它們已連接到相應的類,但是這無法從檢查器中看出:檢查器引用TestForStackOverflow應用程序委託並從不TestForStackOverflowAppDelegate類。只有打開MainWindow時才能看到對「真實」類的引用.xib文件作爲一個XML文件..順便說一句,我已經瞭解魔術發生的地方:) –

+0

只是另一個疑問......當我創建一個HelloWorld基於視圖的應用程序時,自動創建的MainWindow.xib文件僅用於指向你的App Delegate和View Controller類的目的,對嗎?它不是用來繪製你的應用程序的界面,因爲你有這個HelloWorldViewController.xib文件,或者我錯過了什麼?我明白這些可能是顯而易見的問題,但我試圖將拼圖的所有部分放在一起:) –

+0

在MainWindow.xib中,應用程序委託(在該行下方)的實例具有viewController的視圖控制器目標子類和被添加的xib。所以在這種情況下,主窗口僅用於加載。從UIViewController繼承的MainWindow.m/h可能已被添加,並且可能已成爲目標ViewController。但是... – bryanmac

3

1)簡單地說,當UIApplicationMain()叫,

  • 你的應用程序的.plist發現,
  • 關鍵‘的主要筆尖文件基本名稱’看着
  • 此XIB打開,
  • 支持UIApplicationDelegate協議被實例化並用作應用程序委託

2)它們在XIB設置的對象,可以查看他們,如果你

  • 打開主XIB,
  • 選擇AppDelegate對象中,
  • 打開連接檢查此對象,
  • 的面貌邁向奧特萊斯部分

3)你是對的,它們是由編譯器自動創建的。它通過減少行數使得代碼更具可讀性,並且更容易重構只聲明屬性的地方。

希望它有幫助!

+0

當然有幫助,謝謝! –

相關問題