我正在使用Visual Studio for Mac。
当我在iPhone模拟器上构建并运行我的应用程序时,它只能在iPhone XS Max模拟器上运行。
所有其他模拟设备(从XS Max一直到iPhone 6)都将显示初始屏幕,但随后会显示
Foundation.MonoTouchexception...NSInternalInconsistencyException Reason: Application windows are expected to have a root view controller at the end of the application launch
我唯一要测试的物理设备是iPhone 6S Plus,但它也会引发相同的异常。
我尝试清理和重建,删除bin和obj文件夹。
我检查了设备日志,但还没有找到任何东西可以引导我找到解决方案(如果您需要我可以提供的日志)。
关于可能导致此特殊问题的原因或在设备日志中引起关注的任何想法,可能会导致分辨力?
答案 0 :(得分:0)
此问题是由于我的App.xaml页面上的tokenExpiration
引起的。
在某个时候,当我在iPhone XS Max 12.1上测试我的应用程序时,该字符串存储在其他位置,以便在应用程序初始化时该字符串不为空,因此var tokenDate = Convert.ToDateTime(tokenExpiration);
不会引发错误。
然后我的if语句可以成功运行,并且我的应用程序将具有基本的根视图。
但是,对于我以前从未使用过且尚未设置tokenExpiration
字符串的新模拟器,当您要检索此tokenExpiration
时,它将返回一个空字符串作为默认设置。
然后var tokenDate = Convert.ToDateTime(tokenExpiration);
将引发错误,因为它无法转换空字符串。
最后,我的代码随后将运行到我的catch
语句,这意味着我的应用程序失去了基本根视图,这就是导致我出现问题的原因。
上一个代码:
try
{
TaskScheduler.UnobservedTaskException += (sender, e) => {
Console.WriteLine(e.Exception.ToString(), Category.Exception, Priority.High);
};
await NavigationService.NavigateAsync("/LoginPage");
}
catch (Exception e)
{
Console.WriteLine(e.ToString(), Category.Exception, Priority.High);
}
更新的代码:
var tokenExpiration = Preferences.Get("facebookTokenExpiration", string.Empty);
if (tokenExpiration != null && tokenExpiration.Length > 0)
{
var tokenDate = Convert.ToDateTime(tokenExpiration);
var tokenStatus = DateTime.Now.CompareTo(tokenDate);
//Token is still active
if (tokenExpiration != string.Empty & tokenStatus < 0)
{
await NavigationService.NavigateAsync("/MainTabbedPage?selectedTab=PuppyDetailsPage");
}
else
{
await NavigationService.NavigateAsync("/Login");
}
}
else
{
await NavigationService.NavigateAsync("/MainTabbedPage?selectedTab=PuppyDetailsPage");
}
编辑:谢谢@LandLu a forums.xamarin.com帮助我解决此问题。