为了账号安全,请及时绑定邮箱和手机立即绑定

故事板-请参阅AppDelegate中的ViewController

故事板-请参阅AppDelegate中的ViewController

catspeake 2019-10-24 14:25:39
请考虑以下情形:我有一个基于情节提要的应用程序。我将一个ViewController对象添加到情节提要中,将此ViewController的类文件添加到项目中,并在IB身份检查器中指定新类的名称。现在,我该如何从AppDelegate以编程方式引用此ViewController?我已经在相关类中创建了一个变量,并将其转换为IBOutlet属性,但是我看不到任何能够在代码中引用新ViewController的方法-尝试ctrl拖动连接不起作用。即在AppDelegate中,我可以像这样进入基本的ViewController(MyViewController*) self.window.rootViewController但是情节提要中包含的其他ViewController怎么样?
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

看一看的文档进行-[UIStoryboard instantiateViewControllerWithIdentifier:]。这使您可以使用在IB属性检查器中设置的标识符从情节提要中实例化视图控制器:

编辑以添加示例代码:


UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"

                                                         bundle: nil];


MyViewController *controller = (MyViewController*)[mainStoryboard 

                    instantiateViewControllerWithIdentifier: @"<Controller ID>"];



查看完整回答
反对 回复 2019-10-24
?
慕神8447489

TA贡献1780条经验 获得超1个赞

如果使用XCode5,则应以其他方式进行。


选择你UIViewController的UIStoryboard

转到Identity Inspector右上方窗格中的

选中Use Storyboard ID复选框

在Storyboard ID字段中写入唯一的ID

然后编写您的代码。


// Override point for customization after application launch.


if (<your implementation>) {

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" 

                                                             bundle: nil];

    YourViewController *yourController = (YourViewController *)[mainStoryboard 

      instantiateViewControllerWithIdentifier:@"YourViewControllerID"];

    self.window.rootViewController = yourController;

}


return YES;


查看完整回答
反对 回复 2019-10-24
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

通常,系统应使用情节提要处理视图控制器实例化。您想要的是通过获取对的引用来遍历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! MyViewController

myVc.data = self.data

除非您要绕过加载故事板的常规方法并自己加载整个故事板,否则您实际上不应该使用应用程序委托中的故事板ID初始化视图控制器。如果必须从AppDelegate初始化场景,则很可能是在做一些错误的事情。我的意思是想象一下,由于某种原因,您想将数据发送到堆栈中的视图控制器,AppDelegate不应进入视图控制器堆栈以设置数据。那不是它的事。它的业务是rootViewController。让rootViewController处理自己的孩子!因此,如果我通过在info.plist文件中删除对其进行的引用来绕过系统正常的情节提要加载过程,则最多使用以下方法实例化rootViewController:instantiateViewControllerWithIdentifier:,如果是容器,例如UINavigationController,则可能是其根。您要避免的是实例化已由情节提要实例化的视图控制器。我看到的这个问题很多。简而言之,我不同意接受的答案。除非张贴者打算从info.plist中删除故事板的加载,否则这是不正确的,因为否则您将加载2个故事板,这是没有意义的。可能不是内存泄漏,因为系统初始化了根场景并将其分配给窗口,但是随后您又来实例化它并再次分配它。您的应用程序开局非常糟糕!


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 677 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信