您的应用程序委托集在哪里?谁初始化它的 window 和 viewController 属性?

2024-01-10

我有一个关于 IOS 应用程序的新手问题...如果我创建一个名为 TestForStackOverflow 的新的基于视图的应用程序,Xcode 会自动为 TestForStackOverflowAppDelegate.h 创建如下代码:

@class TestForStackOverflowViewController;

@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate>

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

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

@end

以及 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;
}

[...]

这是我的问题:

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 而不需要相应的 iVar(也许它们是由编译器自动创建的),但这是一个好的做法还是您应该始终在类中创建相应的 iVar?

请原谅我的信息很长,我只是希望我没有写出太明显的问题,因为在意大利已经是深夜了,我很累..但是当这些问题出现在我的脑海中时,我迫不及待解决方案 :)


应用程序委托类是如何加载的?

在您的 -info.plist 文件中,有一个名为“Main nib file base name”的键,并且有一个类似于 MainWindow.xib 的视图。在该 xib 文件中,有一个文件的所有者代理对象,并且它有一个设置为应用程序委托类的委托。

在设计器中打开该 XIB。注意顶部的文件所有者对象,上下文单击它并查看委托对象。现在查看 (XCode 4) 行下方设计中的对象 - 您应该在那里看到应用程序委托对象。

appDelegate 设置的 window 和 viewController 在哪里?

查看设计器和上下文,单击 (XCode 4) 行下方的应用程序委托对象。窗口和 viewController 目标绑定在那里。

_window iVar

它会自动为您提供。我不清楚它是由编译器继承还是生成。

以下是关于 _ iVar 的更多信息:为什么在 iOS 中使用前导下划线重命名合成属性? https://stackoverflow.com/questions/5466496/why-rename-synthesized-properties-in-ios-with-leading-underscores

如果您选择在代码中执行等效操作:

删除 plist xib 引用 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您的应用程序委托集在哪里?谁初始化它的 window 和 viewController 属性? 的相关文章

随机推荐