你的应用程序委托集和谁初始化其窗口和viewController属性?
我有一个关于iOS应用程序的新手问题…如果我创build一个名为TestForStackOverflow的新的基于视图的应用程序,Xcode会自动为TestForStackOverflowAppDelegate.h创build如下代码:
@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的实例variables? 我已经看到,你可以在类接口中声明@properties而没有相应的iVars(也许它们是由编译器自动创build的),但这是一个好习惯,还是应该总是在类中创build对应的iVars?
对不起,我只是希望我没有写出太明显的问题,因为在意大利,这里是深夜,我很累。但是当这些问题进入我的脑海时,我不能等待解决scheme :)
应用程序委托类是如何加载的?
在你的-info.plist文件中有一个名为“Main nib file base name”的键,并具有类似于MainWindow.xib的视图。 在这个xib文件中,有一个文件的所有者代理对象,它有一个委托给应用程序的委托类。
在devise器中打开XIB。 注意顶部的文件所有者对象,上下文点击它并查看委托对象。 现在看看(XCode 4)行下面的devise中的对象 – 你应该看到应用程序委托对象。
appDelegate的窗口和viewController在哪里设置?
查看devise器和上下文,单击(XCode 4)行下面的应用程序委托对象。 窗口和viewController目标绑定在那里。
_window iVar
它会自动为您提供。 不清楚它是由编译器inheritance还是生成的。
以下是关于_ iVars的更多信息: 为什么使用前导下划线重命名iOS中的综合属性?
如果您select在代码中执行相同的操作:
删除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; }
1)简单来说,当调用UIApplicationMain()
时,
- 你find应用.plist,
- 查找关键的“主要笔尖文件基本名称”
- 这个XIB是打开的,
- 支持
UIApplicationDelegate
协议的对象被实例化并用作应用程序委托
2)他们被设置在XIB,你可以查看他们,如果你
- 打开主要的XIB,
- selectAppDelegate对象,
- 打开该对象的Connections检查器,
- 看看奥特莱斯部分
3)你是对的,它们是由编译器自动创build的。 它通过减less行数使得代码更具可读性,并且更容易重构,只声明属性的一个地方。
希望能帮助到你!
- 使用SLRequest(无对话框)在iOS 6上传video到Facebook的示例
- Alamofire和Objectmapper将数据添加到tableview
- 在Big Nerd Ranch迅速涉足:iOS Essentials训练营评论
- 由于libWeANDSFLibrary.a(ASIReachability.o)的重复符号链接器错误
- FirebaseStorage:如何删除目录
- Google maps ios:Mapview路线垂直折线总是指向北或位置箭头的顶部
- iOS上的IBDesignable自定义垂直滑块
- 在AudioUnit中内置哪些可以重新采样audio?
- Twitter API应用程序模式authentication