Objective c 您的应用程序委托设置在哪里?谁初始化其窗口和viewController属性?
我有一个关于IOS应用的新手问题。。。如果我创建一个名为TestForStackOverflow的新的基于视图的应用程序,Xcode会自动为TestForStackOverflowAppDelegate.h创建如下代码:Objective c 您的应用程序委托设置在哪里?谁初始化其窗口和viewController属性?,objective-c,ios,xcode,uiapplicationdelegate,Objective C,Ios,Xcode,Uiapplicationdelegate,我有一个关于IOS应用的新手问题。。。如果我创建一个名为TestForStackOverflow的新的基于视图的应用程序,Xcode会自动为TestForStackOverflowAppDelegate.h创建如下代码: @class TestForStackOverflowViewController; @interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate> @property
@class TestForStackOverflowViewController;
@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate>
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet TestForStackOverflowViewController *viewController;
@end
我的问题来了:
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类的窗口和视图控制器属性在哪里设置
3) 这可能很简单,但为什么我们有synthesis window=\u window,而在TestForStackOverflowAppDelegate接口中没有名为_window的实例变量?我已经看到,您可以声明@properties,而不必在类接口中拥有相应的ivar(可能它们是由编译器自动创建的),但这是一种好的做法,还是应该始终在类中创建相应的ivar
请原谅我这么长的留言,我只是希望我没有写一个太明显的问题,因为在意大利这里已经是深夜了,我很累。。但是当这些问题出现在我的脑海中时,我迫不及待地想得到答案:)1)简单一点,当调用UIApplicationMain()
时
- 您的应用程序。plist已找到
- 查找键“Main nib file base name”
- 这个XIB被打开了
- 支持
协议的对象被实例化并用作应用程序委托UIApplicationLegate
- 打开主XIB
- 选择AppDelegate对象
- 打开此对象的连接检查器
- 查看出口部分
希望有帮助 应用程序委托类是如何加载的? 在-info.plist文件中有一个名为“Main nib file base name”的键,其视图类似于MainWindow.xib。在该xib文件中,有一个文件的所有者代理对象,它将一个委托设置为app delegate类 在设计器中打开该XIB。注意顶部文件的所有者对象,上下文单击它并查看委托对象。现在看一下(XCode 4)行下面的设计中的对象-您应该在那里看到app delegate对象 appDelegate集合的窗口和视图控制器在哪里? 查看设计器并在上下文中单击(XCode 4)行下方的app delegate对象。窗口和viewController目标绑定在那里 \u窗口iVar 它是自动为您提供的。我不清楚它是由编译器继承还是生成的 以下是关于iVars的更多信息: 如果您选择在代码中执行等效操作: 移除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;
}
好啊我检查了MainWindow.xib文件,该文件在plist文件中被引用为主NIB文件,我看到它中定义了一些对象,例如TestForStackOverflow应用程序委托和TestForStackOverflow视图控制器。我知道它们连接到相应的类,但从检查器中看不到这一点:检查器引用TestForStackOverflowAppDelegate,而从不引用TestForStackOverflowAppDelegate类。只有将MainWindow.xib文件作为XML文件打开时,我才能看到对“真实”类的引用。。顺便说一句,我知道魔法发生在哪里:)这只是另一个疑问。。。创建基于HelloWorld视图的应用程序时,自动创建的MainWindow.xib文件仅用于指向应用程序委托和视图控制器类,对吗?它不用于绘制应用程序的界面,因为您有HelloWorldViewController.xib文件用于此目的,或者我遗漏了什么?我理解这些可能是显而易见的问题,但我正试图把所有的谜题放在一起:)在MainWindow.xib中,应用程序委托的实例(在下面的行中)有一个viewController子类的视图控制器目标和添加的xib。因此,在这种情况下,主窗口仅用于加载。可能已添加从UIViewController继承的MainWindow.m/h,该MainWindow.m/h可能是目标ViewController。但是…但是,我的2美分。。。最终,界面生成器非常擅长布局。控制每个控件的各个方面最好用代码来控制,因为(1)我可以复制/粘贴我一直在做的块,而不是记住我在IB中签入了哪些框;(2)合并起来要容易得多。因此,我通过上面的代码进行初始化,没有任何魔力或混乱。我仍然仅将IB用于布局。相关:
- (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;
}