使用 swift2 的警报控制器未显示在 iphone 中

alert controller not displaying in iphone using swift2

在我的应用程序中,我想使用警报控制器,所以我使用以下代码:

import UIKit
import CoreLocation
class GPSTrackingManager: NSObject,CLLocationManagerDelegate {
  var locationManager: CLLocationManager!
var seenError : Bool = false

func startTracking() {

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
}

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    locationManager.stopUpdatingLocation()
    print("error occured:\(error)")


}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    //println("locations = \(locationManager)")
    let latValue = locationManager.location!.coordinate.latitude
    let lonValue = locationManager.location!.coordinate.longitude

    print(latValue)
    print(lonValue)
    GoogleLat = latValue
    GoogleLong = lonValue
    CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in

        if (error != nil)
        {
            print("Reverse geocoder failed with error" + error!.localizedDescription)
            return
        }

        if placemarks!.count > 0
        {
            let pm = placemarks![0] as CLPlacemark
            self.displayLocationInfo(pm)
        }
        else
        {
            print("Problem with the data received from geocoder")
        }
    })

}
func displayLocationInfo(placemark: CLPlacemark?)
{
    if let containsPlacemark = placemark
    {
            locationManager.stopUpdatingLocation()
            let fourthcity = (containsPlacemark.subAdministrativeArea != nil) ? containsPlacemark.subAdministrativeArea : ""
            let fourthState = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea : ""
            let fourthCountry = (containsPlacemark.country != nil) ? containsPlacemark.country : ""
            print("my Real City = \(fourthcity)")
            let fullName = fourthcity
            let fullNameArr = fullName!.characters.split{[=11=] == " "}.map(String.init)
            fullNameArr[0]
            print(fullNameArr[0])
            print("myState = \(fourthState)")
            print("myCountry = \(fourthCountry)")
            appDelCityname = fullNameArr[0]
            appDelStateName = fourthState
            appDelCountryName = fourthCountry
            print("AppDelegate City Name = \(appDelCityname)")

    }

}

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined:
        // If status has not yet been determied, ask for authorization
        manager.requestWhenInUseAuthorization()
        break
    case .AuthorizedWhenInUse:
        // If authorized when in use
        print("AuthorizedWhenInUse")
        manager.startUpdatingLocation()
        break
    case .AuthorizedAlways:
        // If always authorized
        print("AuthorizedAlways")
        manager.startUpdatingLocation()
        break
    case .Denied:
        // If user denied your app access to Location Services, but can grant access from Settings.app
        print("user denied to allow")
          dispatch_async(dispatch_get_main_queue(), {
       NSTimer.scheduledTimerWithTimeInterval(3.0,target: self, selector: #selector(self.DisplayalertToturnonLocation), userInfo: nil, repeats: false)
            })
        break
    default:
        print("user cant allow location service")
        break
    }
}

func DisplayalertToturnonLocation(){

    let alertController = UIAlertController(title: "GPRS is Required", message: "This app requires your location,please turn on your location service or set your address", preferredStyle: .Alert)

    let saveAction = UIAlertAction(title: "Set Address", style: UIAlertActionStyle.Default, handler: {
        alert -> Void in
        self.alertTogetAdrressFromUser()

    })
    alertController.addAction(saveAction)
    let cancelAction = UIAlertAction(title: "Settings", style: UIAlertActionStyle.Default, handler: {
        (action : UIAlertAction!) -> Void in
        UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)

    })
    alertController.addAction(cancelAction)

    let keyWindow = UIApplication.sharedApplication().keyWindow
    let mainController = keyWindow!.rootViewController!
    mainController.presentViewController(alertController, animated: true, completion: nil)

}
}

我在 AppDelegate 中调用这个函数,它在 iPad 中执行良好,但在 iPhone 中执行得不好,它也没有显示任何错误或警告,我感觉很难找到这里做错了什么所以谁帮我在 iPhone.

中显示警报控制器

在 AppDelegate 中:

var tracking = GPSTrackingManager()

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
 tracking.startTracking()
}

in here you need to follow two things . 1. your code is fine you need to show ur alertcontroller using main thread, else find the root wihch one is most top presnt your alert, else check once your current window is visible or not

present your UIAlertcontroller in Main thread, for e.g

Swift3

 DispatchQueue.main.async {
  self.tracking.DisplayalertToturnonLocation()
    }

swift2

  dispatch_async(dispatch_get_main_queue()) {
    self.tracking.DisplayalertToturnonLocation()
}

你得到的输出为

完整代码

class GPSTrackingManager: NSObject {

func DisplayalertToturnonLocation(){
    
    let alertController = UIAlertController(title: "GPRS is Required", message: "This app requires your location,please turn on your location service or set your address", preferredStyle: .alert)
    
    let saveAction = UIAlertAction(title: "Set Address", style: UIAlertActionStyle.default, handler: {
        alert -> Void in
      //  self.alertTogetAdrressFromUser()
        
    })
    alertController.addAction(saveAction)
    let cancelAction = UIAlertAction(title: "Settings", style: UIAlertActionStyle.default, handler: {
        (action : UIAlertAction!) -> Void in
      //  UIApplication.shared.openURL(NSURL(string: UIApplicationOpenSettingsURLString)! as URL)
        
    })
    alertController.addAction(cancelAction)
    
    UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)

 
    
}
}