MonoTouch 和“应用程序在应用程序启动结束时应该有一个根视图控制器”错误
Posted
技术标签:
【中文标题】MonoTouch 和“应用程序在应用程序启动结束时应该有一个根视图控制器”错误【英文标题】:MonoTouch and "Applications are expected to have a root view controller at the end of application launch" error 【发布时间】:2011-11-07 14:58:29 【问题描述】:ios5 的新应用风格,你必须在 UIWindow 上设置 RootViewController,这让我很困惑。
我已经从这里下载了最新的 MonoTouch.Dialog 库:
https://github.com/migueldeicaza/MonoTouch.Dialog
但是当我尝试在模拟器上编译并运行包含的“Sample”项目时,它崩溃并返回以下错误:
错误:应用程序在应用程序启动结束时应该有一个根视图控制器
然后我在 GitHub 上打开了一个问题:
https://github.com/migueldeicaza/MonoTouch.Dialog/issues/65
但米格尔回答我说:
如果你在iOS5中使用新风格的应用程序,你必须在UIWindow上设置RootViewController。 这是一个新的 iOS 5 特性部分的清理,以使 UIViewController 包含到位。
我尝试将示例应用程序的导航控制器分配给窗口根视图控制器,但没有任何效果。仍然得到同样的错误。这是包含的示例应用程序的 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;
我添加的唯一代码行是 cmets 中指示的那一行,但此添加似乎无法解决错误。我有什么遗漏吗?
提前致谢!
【问题讨论】:
您的意思是您不能使用 MT5 编译 MT.D (form GIT) 并使其在 iOS (5) 模拟器上运行?这就是为什么你要添加这(单)行代码? 是的。我正在尝试使用 MonoTouch 5.0 编译 MonoTouch.Dialog 示例项目。但是我遇到了崩溃和那个错误。有人试过用 MonoTouch 5.0 编译它吗? 我在正在处理的 MonoGame 项目中也遇到此错误(因为视图/控制器都隐藏在 MonoGame 中)。但是,没有任何崩溃,我只是在控制台上收到一条“警告”消息。你确定它没有在其他地方崩溃吗? 【参考方案1】:我已经更新了 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);
【讨论】:
【参考方案2】:好的,Miguel 似乎上传了新版本的库。他用“更新到 MonoDevelop 2.8”评论了提交。
https://github.com/migueldeicaza/MonoTouch.Dialog/commit/25974c5c28d31c022d232a449ef9fbc766506701
现在示例工作正常(您仍然需要在 Info.plist 文件中手动将 MainWindow 设置为主界面以使错误消失。上次还不够。)。
似乎问题出在项目设置中,而不是在 rootviewcontroller 中。即使最终没有它也能正常工作(也许更专家的人可以解释这个奇怪的事情)。不幸的是,MonoDevelop 的错误信息具有误导性!
【讨论】:
感谢您的解释,通过更改项目文件和设置主界面文件为我工作。【参考方案3】:尝试删除window.AddSubview(navigation.View);
行。
【讨论】:
以上是关于MonoTouch 和“应用程序在应用程序启动结束时应该有一个根视图控制器”错误的主要内容,如果未能解决你的问题,请参考以下文章
应用程序在应用程序启动结束时应该有一个根视图控制器 wait_fences: failed to receive reply: 10004003