Xcode如何通过故事板隐式设置rootViewController?

Xcode如何通过故事板隐式设置rootViewController?

问题描述:

Xcode与项目文件Info.plist找到main.storyboard并找到初始ViewController。但我希望能在AppDelegate中看到ViewController的一些锅炉板代码。Xcode如何通过故事板隐式设置rootViewController?

的AppDelegate看起来空白:(没有提到的ViewController

@implementation AppDelegate  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    return YES; 
} 

... 

@end 

故事板是XML: enter image description here

问题

不Xcode中什么魔法代码请参考故事板xml并找到控制器?

编译后,main()调出AppDelegate,它应该直接引用ViewController或者有一个代理Storyboard对象来访问ViewController。

我错过了什么?

+0

我认为这个问题增值,答案是惊人的。 –

我觉得我的书(你已经找到),充分说明了它。 main调用UIApplicationMain()并遵循一定的规则。如果你有一个主要情节串连图板在Info.plist中指定的 - 你做 - 那么:

  • UIApplication初始视图控制器实例(其与入口点的箭头)出来的故事板。这是ViewController实例。

  • 它还实例化UIApplication类。

  • 它还实例化应用程序委托类(在UIApplicationMain调用中指定),并将其分配给UIApplication的delegate属性。

  • 它创建一个窗口并将其分配给应用程序代理的window属性,然后将该视图控制器分配给该窗口的rootViewController属性。

  • 然后显示窗口(并在应用程序代理上调用applicationDidFinishLaunching...)。

这完全解释了启动过程。

+0

你好亚光,你指的是哪本书。我很想了解这些点至少在很高的层次上如何连接。 这个解释真的很有帮助。我找到了关于某些类的所有解释,但没有太多关于Xcode如何在应用程序中隐式起作用。 –

+1

http://www.apeth.com/iOSBook/ch06.html停止说Xcode。 Xcode不起作用。您可以使用Xcode进行编译和构建。你在运行时运行。运行时正在这样做。你知道吗,可可。你打电话给UIApplicationMain,这就是它的作用。我不明白为什么这很难。你现在被三个不同的人告诉了三次。 – matt

+1

感谢您的纠正,Xcode只是建立。基于故事板的界面生成器起初看起来很神奇,UI由Xcode提供,所以它看起来像它的Xcode。 –

一张图片胜过千言万语。但是,这里有一个简短的描述:“它在你的项目的settings/info.plist中”。

在下图中“Main”是我最初的故事板的名称。此外,初始视图控制器在界面生成器中有一个标志,表示“是初始视图控制器”,告诉它它是您希望首先运行的视图控制器。

P.S.点击图片放大他们:)

enter image description here

enter image description here

enter image description here

+0

嗨布兰登,这真的很有帮助,并在一定程度上回答了这个问题。 我想了解构建过程中的控制流程。 它看起来像Info.plist是应用程序的清单。我在哪里可以阅读关于xcode如何浏览应用程序架构以编译应用程序? –

+0

XCode只是一个IDE/Build系统。铿锵是它用来编译你的应用程序的编译器。 – Brandon

+0

发现此http://www.apeth.com/iOSBook/ch06.html解释更深一点。 (有帮助) –

简而言之,Objective-C的动态特性允许UIApplicationMain()仅从存储在应用程序的info.plist文件和主要NIB或主Storyboard中的文本信息引导您的应用程序。编译器不需要生成样板代码。

较长的答案:

UIApplicationMain通过Objective-C运行做以下的事情:

  • 在所有情况下,UIApplicationMain()实例化NSPrincipalClass关键在你的plist中,通常UIApplication但可以一个自定义子类。

  • 在一个旧式的无NIB应用程序中,UIApplicationMain()将实例化在main.m中指定的AppDelegate类。将接线的AppDelegate到UIApplication,然后用手关闭的AppDelegate中创建该应用窗口中,根视图控制器等

  • 在基于NIB的应用程序,UIApplicationMain不知道的AppDelegate的名称。相反,它会载入您的主要NIB文件NSMainNibFile,如plist中所述。 NIB负责实例化你的AppDelegate并连接到UIApplication,并创建你的主窗口和根视图控制器。

  • 在Storyboard应用程序中,UIApplicationMain实例化了main.m中指定的NSPrincipalClass和应用程序委托,就像无NIB应用程序一样。然后加载主要故事板,它知道初始视图控制器是谁。它创建一个窗口,实例化初始视图控制器,并将其指定为窗口的根视图控制器。

+0

对3代应用程序启动过程的很好的解释:) –

这背后的原因: -

enter image description here

,如果你删除标志您会得到一个空白屏幕。

+0

感谢您的回答,实际上我想知道AppDelegate如何了解它。 Xcode只是一个IDE。 –

+0

我不认为我可以解释背后的过程,因为我也是一个初学者和学习,但也许这会触发一些方法,为初始视图创建方法。 @YugalJindle – dreamBegin