从另一个 UIViewController 中呈现一个 UIViewController?

Posted

技术标签:

【中文标题】从另一个 UIViewController 中呈现一个 UIViewController?【英文标题】:Presenting a UIViewController from inside another UIViewController? 【发布时间】:2012-04-26 23:37:29 【问题描述】:

我对 ios 还很陌生,我正在尝试从另一个视图控制器中呈现一个视图控制器,如下所述:

Stack overflow answer(见第三个答案)

还有here on Apple's site

我从Hello World Example code 开始。我打开 MyViewController.m 并修改 updateString() 方法,将这段代码添加到末尾:


        // Get the application's "window"
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
        // Get the window's rootViewController (NOTE: Only works on iOS 4.0 or later!)
    UIViewController *rootViewController = window.rootViewController;

        // Create our new controller
    UIViewController *enterNameController = [[UIViewController alloc] initWithNibName:@"HighScore" bundle:[NSBundle mainBundle]];

    if (enterNameController != NULL)
    
        printf("\nLoaded UIView controller. Installing as actionSheetController...\n\n");

        UINavigationController *navigationController = [[UINavigationController alloc]
                         initWithRootViewController:enterNameController];

            // Present out Enter Name for High Score view as a modal view
    //  [rootViewController presentViewController:navigationController animated:YES];       // iOS 2.0 and newer
        [self presentViewController:navigationController animated:YES completion: nil];     // iOS 5.0 and newer
    

我还创建了一个名为“HighScore.xib”的 NIB 文件,我将它与 HelloWorld 附带的其他 NIB 文件放在一起,并将 HighScore.xib 添加到 XCode 项目中,并将其拖到“复制包”中资源”部分。

按原样,在运行并将文本输入编辑字段时出现错误:

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在包中加载 NIB:“NSBundle(已加载)”,名称为“HighScore””

但是,如果我将最终语句更改为使用“rootViewController”而不是“self”,那么 什么都不会发生。也不例外,但也没有提出新的观点。

问题:

1) 为什么我的 NIB 无法加载?我显然在这里做错了什么。

2) 为什么使用“rootViewController”而不是“self”会产生不同的结果? rootViewController不应该找到与“self”相同的类吗?

请注意,当使用“rootViewController”时,我在 XCode 中收到警告:“MyViewController”可能无法响应“-presentViewController:animated:completion”

【问题讨论】:

NIB 文件名输入正确 initWithNibName:@"HighScore",检查你的项目中是否有 HighScore.xib 文件...! 是的,如上所述,它也在项目中和复制捆绑资源部分中,并且名称正确。 【参考方案1】:

我通过以下方式解决了这个问题:

a) 在此处使用教程:

http://timneill.net/2010/09/modal-view-controller-example-part-1/

b) 右键单击​​并在 XCode 项目中的 .xib 文件上执行“获取信息”,并将其类型修改为“file.xib”而不是“sourcecode.xib”。如果没有第二次更改,它将无法加载!奇怪。但这最终是问题所在!

【讨论】:

以上是关于从另一个 UIViewController 中呈现一个 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 ViewController 呈现故事板 ViewController

初学者:如何以编程方式从另一个视图呈现 UITableView

有没有办法查看当前 UIViewController 是不是从另一个 UIViewController 的解雇中出现

从另一个 UIViewController 推送一个 UIViewController - 如何?

如何从另一个 UIViewController 触发 UITabBarController 的一个 UIViewController?

从另一个 UIViewController 刷新表