ios - Xamarin iOS 在应用程序从后台返回时呈现不同的 View Controller

标签 ios swift xcode xamarin xamarin.ios

我正在开发的 xamarin ios 应用程序要求始终启用 GPS。首次安装该应用程序时,用户会收到启用 GPS 的提示,但用户可以选择在设备级别关闭定位服务。

我希望我的应用提示(即 NAG)用户启用 gps。因此,我创建了一个新的 viewcontroller 和相应的 xib 文件。 xib 文件看起来像这样

New View Controller

我在 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/

相关文章:

ios - 在应用程序中使用自定义 InputViewController

ios - 通过 Braintree PayPal 支付总是失败 iOS

xcode - Swift 2.0 Xcode 7.1 图像选择器前置摄像头图像在选择时旋转

ios - 委托(delegate)函数未被调用

swift - 如何在加载了 JSON API 数据的表格 View 单元格中保存复选标记属性?

ios - 当栏位置为 UIBarPositionTopAttached 时,UIToolbar 阴影不会隐藏

ios - 如何在 iPhone 中以编程方式保存带有时间戳的屏幕截图?

ios - 发送到已释放实例的消息 - 视为属性

objective-c - 如何在NSString中使用文本和变量的组合?

iphone - Leaks Instrument 中的颜色和百分比表示什么?