2011-09-23 51 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

当然有帮助,谢谢! –

相关问题