故事板-请参阅AppDelegate中的ViewController

请考虑以下情形:我有一个基于情节提要的应用程序。我将一个ViewController对象添加到情节提要中,将此ViewController的类文件添加到项目中,并在IB身份检查器中指定新类的名称。现在,我该如何从AppDelegate以编程方式引用此ViewController?我已经在相关类中创建了一个变量,并将其转换为IBOutlet属性,但是我看不到任何能够在代码中引用新ViewController的方法-尝试ctrl拖动连接不起作用。


即在AppDelegate中,我可以像这样进入基本的ViewController


(MyViewController*) self.window.rootViewController

但是情节提要中包含的其他ViewController怎么样?


catspeake
浏览 687回答 3
3回答

LEATH

看一看的文档进行-[UIStoryboard instantiateViewControllerWithIdentifier:]。这使您可以使用在IB属性检查器中设置的标识符从情节提要中实例化视图控制器:编辑以添加示例代码:UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bundle: nil];MyViewController *controller = (MyViewController*)[mainStoryboard&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; instantiateViewControllerWithIdentifier: @"<Controller ID>"];

慕神8447489

如果使用XCode5,则应以其他方式进行。选择你UIViewController的UIStoryboard转到Identity Inspector右上方窗格中的选中Use Storyboard ID复选框在Storyboard ID字段中写入唯一的ID然后编写您的代码。// Override point for customization after application launch.if (<your implementation>) {&nbsp; &nbsp; UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bundle: nil];&nbsp; &nbsp; YourViewController *yourController = (YourViewController *)[mainStoryboard&nbsp;&nbsp; &nbsp; &nbsp; instantiateViewControllerWithIdentifier:@"YourViewControllerID"];&nbsp; &nbsp; self.window.rootViewController = yourController;}return YES;

神不在的星期二

通常,系统应使用情节提要处理视图控制器实例化。您想要的是通过获取对的引用来遍历viewController层次结构,self.window.rootViewController而不是初始化视图控制器,如果正确设置了故事板,则应该已经正确初始化了。因此,假设您rootViewController是一个UINavigationController,然后要向其顶部视图控制器发送内容,则可以在AppDelegate的控件中执行以下操作didFinishLaunchingWithOptions:UINavigationController *nav = (UINavigationController *) self.window.rootViewController;MyViewController *myVC = (MyViewController *)nav.topViewController;myVC.data = self.data;在Swift中,如果非常相似:let nav = self.window.rootViewController as! UINavigationController;let myVC = nav.topViewController as! MyViewControllermyVc.data = self.data除非您要绕过加载故事板的常规方法并自己加载整个故事板,否则您实际上不应该使用应用程序委托中的故事板ID初始化视图控制器。如果必须从AppDelegate初始化场景,则很可能是在做一些错误的事情。我的意思是想象一下,由于某种原因,您想将数据发送到堆栈中的视图控制器,AppDelegate不应进入视图控制器堆栈以设置数据。那不是它的事。它的业务是rootViewController。让rootViewController处理自己的孩子!因此,如果我通过在info.plist文件中删除对其进行的引用来绕过系统正常的情节提要加载过程,则最多使用以下方法实例化rootViewController:instantiateViewControllerWithIdentifier:,如果是容器,例如UINavigationController,则可能是其根。您要避免的是实例化已由情节提要实例化的视图控制器。我看到的这个问题很多。简而言之,我不同意接受的答案。除非张贴者打算从info.plist中删除故事板的加载,否则这是不正确的,因为否则您将加载2个故事板,这是没有意义的。可能不是内存泄漏,因为系统初始化了根场景并将其分配给窗口,但是随后您又来实例化它并再次分配它。您的应用程序开局非常糟糕!
打开App,查看更多内容
随时随地看视频慕课网APP