MonoTouch和“应用程序在应用程序启动结束时应该有一个根视图控制器”错误

时间:2011-11-07 14:58:29

标签: c# ios uiviewcontroller xamarin.ios monotouch.dialog

iOS5中新的应用程序样式,你必须在UIWindow上设置RootViewController,这让我很困惑。

我从这里下载了最新的MonoTouch.Dialog库:

https://github.com/migueldeicaza/MonoTouch.Dialog

但是当我尝试在Simulator上编译并运行包含的“Sample”项目时,它会崩溃并返回以下错误:

  

错误:应用程序在应用程序启动结束时应该有一个根视图控制器

然后我在GitHub上打开了一个问题:

https://github.com/migueldeicaza/MonoTouch.Dialog/issues/65

但米格尔回答我:

  

如果在iOS5中使用新风格的应用程序,则必须在UIWindow上设置RootViewController。      这是清理的一个新的iOS 5功能部分,用于将UIViewController包含在其中。

我尝试将Sample应用程序的Navigation控制器分配给窗口根视图控制器,但没有任何效果。仍然得到同样的错误。这是包含的Sample应用程序的FinishedLaunching方法:

public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        var Last = new DateTime (2010, 10, 7);
        Console.WriteLine (Last);

        var p = Path.GetFullPath ("background.png");
        window.AddSubview (navigation.View);

         //ADDING THE Navigation Controller as RootViewController
        window.RootViewController = navigation; //THIS LINE WAS ADDED BY ME

        var menu = new RootElement ("Demos"){
            new Section ("Element API"){
                new StringElement ("iPhone Settings Sample", DemoElementApi),
                new StringElement ("Dynamically load data", DemoDynamic),
                new StringElement ("Add/Remove demo", DemoAddRemove),
                new StringElement ("Assorted cells", DemoDate),
                new StyledStringElement ("Styled Elements", DemoStyled) { BackgroundUri = new Uri ("file://" + p) },
                new StringElement ("Load More Sample", DemoLoadMore),
                new StringElement ("Row Editing Support", DemoEditing),
                new StringElement ("Advanced Editing Support", DemoAdvancedEditing),
                new StringElement ("Owner Drawn Element", DemoOwnerDrawnElement),
            },
            new Section ("Container features"){
                new StringElement ("Pull to Refresh", DemoRefresh),
                new StringElement ("Headers and Footers", DemoHeadersFooters),
                new StringElement ("Root Style", DemoContainerStyle),
                new StringElement ("Index sample", DemoIndex),
            },
            new Section ("Auto-mapped", footer){
                new StringElement ("Reflection API", DemoReflectionApi)
            },
        };

        var dv = new DialogViewController (menu) {
            Autorotate = true
        };
        navigation.PushViewController (dv, true);               

        window.MakeKeyAndVisible ();

        return true;
    }

我添加的唯一代码行是注释中指示的代码,但这个添加似乎不能解决错误。有什么我想念的吗?

提前致谢!

3 个答案:

答案 0 :(得分:5)

我已在MonoTouch.Dialog中更新了示例,以展示如何将视图控制器添加到iOS 4.x系统和5.x系统,并应解决此问题。

简短的版本是window.AddSubview(navigation.View)是iOS 4.3的服务方式,你需要设置window.RootViewController属性的新版本,如下所示:

        if (UIDevice.CurrentDevice.CheckSystemVersion (5, 0))
            window.RootViewController = navigation; 
        else
            window.AddSubview (navigation.View);            

答案 1 :(得分:1)

好的,似乎Miguel上传了一个新版本的库。他用“更新MonoDevelop 2.8”对提交进行了评论。

https://github.com/migueldeicaza/MonoTouch.Dialog/commit/25974c5c28d31c022d232a449ef9fbc766506701

现在示例工作正常(您仍然需要在Info.plist文件中手动将MainWindow设置为主界面以使错误消失。上次它还不够。)。

似乎问题出在项目设置中,而不是在rootviewcontroller中。它甚至没有一个工作正常(也许有更多专家可以解释这个奇怪的事情)。不幸的是,MonoDevelop的错误消息具有误导性!

答案 2 :(得分:0)

尝试删除window.AddSubview(navigation.View);行。