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

Ios 使用swift2的iphone中未显示警报控制器,ios,iphone,ipad,swift2,uialertcontroller,Ios,Iphone,Ipad,Swift2,Uialertcontroller,在我的应用程序中,我想使用alert controller,因此我使用以下代码: import UIKit import CoreLocation class GPSTrackingManager: NSObject,CLLocationManagerDelegate { var locationManager: CLLocationManager! var seenError : Bool = false func startTracking() { locationManag

在我的应用程序中,我想使用alert controller,因此我使用以下代码:

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{$0 == " "}.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()
}
在这里,你需要遵循两件事。1.你的代码很好,你需要使用主线程显示你的alertcontroller,否则找到根目录,其中一个是最上面的,显示你的警报,否则在当前窗口可见或不可见时检查

在主线程中显示您的UIAlertcontroller,例如

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)

 
    
}
}
在这里,你需要遵循两件事。1.你的代码很好,你需要使用主线程显示你的alertcontroller,否则找到根目录,其中一个是最上面的,显示你的警报,否则在当前窗口可见或不可见时检查

在主线程中显示您的UIAlertcontroller,例如

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)

 
    
}
}

我只是在appdelegate中调用这个函数,它在ipad中工作,但在iphone@anbu中不工作。karthik@are你看到了重复的答案,如果您没有得到输出,请再试一次。我重新打开问题为什么您将此标记为“重复其他stackOverflow”,问题是如何在appdelegate中显示警报控制器,但请参阅我的问题“我问了什么”@anbu.karthikalready重复的答案解决了您的问题,在这里,您需要遵循两件事。1.你的代码很好,你需要使用主线程显示你的alertcontroller,否则找到根目录,根目录中的一个是最顶层,提示你的警报,否则检查当前窗口是否可见这是正确的方法,现在我只是在appdelegate中调用这个函数,它在ipad中工作,但在iphone@anbu中不工作。karthik@are你看到了重复的答案,如果您没有得到输出,请再试一次。我重新打开问题为什么您将此标记为“重复其他stackOverflow”,问题是如何在appdelegate中显示警报控制器,但请参阅我的问题“我问了什么”@anbu.karthikalready重复的答案解决了您的问题,在这里,您需要遵循两件事。1.你的代码很好,你需要使用主线程显示你的alertcontroller,否则找到根目录,其中一个是最上面的,显示你的警报,否则检查当前窗口是否可见这是正确的方法,现在我重新打开