我正在开发的 xamarin ios 应用程序要求始终启用 GPS。首次安装该应用程序时,用户会收到启用 GPS 的提示,但用户可以选择在设备级别关闭定位服务。
我希望我的应用提示(即 NAG)用户启用 gps。因此,我创建了一个新的 viewcontroller 和相应的 xib 文件。 xib 文件看起来像这样
我在 WillEnterForeground 中添加了以下代码并且没有错误,但是显示了 View ,但是如果启用了 gps,则显示该 View 而不是以前的事件 View 。
public override void WillEnterForeground(UIApplication application)
{
Console.WriteLine("App will enter foreground");
if (CLLocationManager.Status == CLAuthorizationStatus.Denied
|| CLLocationManager.Status == CLAuthorizationStatus.Restricted
|| CLLocationManager.Status == CLAuthorizationStatus.NotDetermined)
{
window = new UIWindow(UIScreen.MainScreen.Bounds);
var rootNavigationController = new UINavigationController();
rootNavigationController.PushViewController(new LocationServicesVerifyViewController(), false);
window.RootViewController = rootNavigationController;
window.MakeKeyAndVisible();
}
}
我的想法是,如果未启用位置服务,我将在应用程序启动时或从后台返回时显示此 View 。
单击“启用 GPS”按钮将运行以下代码,基本上会将用户带到设备上的位置部分。
if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
{
NSString settingsString = UIApplication.OpenSettingsUrlString;
NSUrl url = new NSUrl(settingsString);
UIApplication.SharedApplication.OpenUrl(url);
}
我的类(class)声明是
// class-level declarations
UIWindow window;
我目前完成的启动方法是这样的
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
AppDelegate.Self = this;
window = new UIWindow(UIScreen.MainScreen.Bounds);
var rootNavigationController = new UINavigationController();
window.RootViewController = rootNavigationController;
DataAccess.CheckDatabase();
if (DataAccess.GetLicence().APIKey == "")
{
rootNavigationController.PushViewController(new LicenceActivationViewController(), false);
}
else
{
rootNavigationController.PushViewController(new JobListViewController(), false);
}
window.MakeKeyAndVisible();
return true;
}
最佳答案
首先,当您想在 AppDelegate 中显示 LocationServicesVerifyViewController
时,无需创建新窗口。您可以使用以下方法获取当前窗口的 Root View Controller :Window.RootViewController
。然后在该 View Controller 上方呈现一个新 Controller 。
其次,当位置状态被拒绝时,我们应该检测当前顶部呈现的 View Controller 的类型。如果它是 LocationServicesVerifyViewController
,我们不应该再次呈现它。
最后,当用户更改了位置状态并返回到应用程序时。我们可以通过关闭当前顶部显示的 View Controller 来显示前一个 View Controller 。
这是我的代码供您引用:
public override void WillEnterForeground(UIApplication application)
{
if (CLLocationManager.Status == CLAuthorizationStatus.Denied
|| CLLocationManager.Status == CLAuthorizationStatus.Restricted
|| CLLocationManager.Status == CLAuthorizationStatus.NotDetermined)
{
var topViewController = GetTopPresented(Window.RootViewController);
if ( !(topViewController is LocationServicesVerifyViewController))
{
LocationServicesVerifyViewController controller = (LocationServicesVerifyViewController)UIStoryboard.FromName("Main", null).InstantiateViewController("LocationServicesVerifyViewController");
topViewController.PresentViewController(controller, true, null);
}
}
else
{
var topViewController = GetTopPresented(Window.RootViewController);
if (topViewController is LocationServicesVerifyViewController)
{
topViewController.DismissViewController(true, null);
}
}
}
UIViewController GetTopPresented(UIViewController viewController)
{
if (viewController.PresentedViewController != null)
{
return GetTopPresented(viewController.PresentedViewController);
}
else
{
return viewController;
}
}
我在Main.storyboard 中定义了LocationServicesVerifyViewController
,所以它的构造函数是不同的。但这不影响其他东西,你可以根据需要更改这部分。
关于ios - Xamarin iOS 在应用程序从后台返回时呈现不同的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56581289/