我有一些以下的json数据:
这将全部显示在地图视图中。因此当用户按下地图中的任何引脚时。将显示地址,姓名呼叫按钮。
action method
我有一个call button
..所以如果有任何用户按我的地图中的任何图钉。它会显示Address, name, one call button
...因此,如果用户按下该呼叫按钮,它会显示我name and address
的相应或正确的电话号码,它应显示在普通电话拨号盘中。
我做了一些目标 - c。但我对swift 2.0并不擅长。
任何人都可以帮我解决这个问题。
完整代码:
import UIKit
import MapKit
import CoreLocation
class mapVC: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var AddressTitleLabel: UILabel!
@IBOutlet weak var AddressSubtitleLabel: UILabel!
@IBOutlet weak var LocationView: UIView!
@IBOutlet weak var ResultCounts: UILabel!
@IBOutlet weak var AddressImg: UIImageView!
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
mapSearch()
LocationView.hidden = true
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
mapView.delegate = self
}
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
print("Inside selecting annotation")
LocationView.hidden = false
if let newTitle = view.annotation?.title, let newAddress = view.annotation?.subtitle, let AddressNewImage = view.detailCalloutAccessoryView {
AddressTitleLabel.text = newTitle
AddressSubtitleLabel.text = newAddress
//setting callout accessory as image to UIImage
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0);
AddressNewImage.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let NAimage:UIImage = UIGraphicsGetImageFromCurrentImageContext();
AddressImg.image = NAimage
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location : CLLocationCoordinate2D = manager.location!.coordinate;
let long = location.longitude;
let lat = location.latitude;
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in
if (error != nil) {
print("Reverse geocoder failed with error" + error!.localizedDescription)
return
}
})
let loadlocation = CLLocationCoordinate2D(
latitude: lat, longitude: long
)
mapView.centerCoordinate = loadlocation;
let span = MKCoordinateSpanMake(0.2, 0.2)
let region = MKCoordinateRegion(center: loadlocation, span: span)
mapView.setRegion(region, animated: true)
let annotation = MKPointAnnotation()
annotation.coordinate = loadlocation
annotation.title = "Current Location"
annotation.subtitle = "You are Here."
mapView.addAnnotation(annotation)
locationManager.stopUpdatingLocation();
}
func mapSearch(){
//Map search for Level Income in the selected region area
let url:NSURL = NSURL(string: "url")!
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data:NSData?, response: NSURLResponse?, error:NSError?) -> Void in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.ResultCounts.text = "\(json.count) Results"
// Loop through all items and display them on the map
var lon:Double!
var lat:Double!
var annotationView:MKPinAnnotationView!
var pointAnnoation:LocationClass!
//2
for item in json{
let obj = item as! Dictionary<String,AnyObject>
lon = obj["longitude"]!.doubleValue
lat = obj["latitude"]!.doubleValue
pointAnnoation = LocationClass()
pointAnnoation.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lon)
pointAnnoation.title = obj["name"] as? String
pointAnnoation.subtitle = obj["address"] as? String
pointAnnoation.pinCustomImageName = "other_location.png"
let ImageName = obj["image"] as? String
let imgURL: NSURL = NSURL(string: ImageName!)!
let request: NSURLRequest = NSURLRequest(URL: imgURL)
let session = NSURLSession.sharedSession()
let Imgtask = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
if (error == nil && data != nil)
{
func display_image()
{
pointAnnoation.DisplayImage = UIImage(data: data!)
}
dispatch_async(dispatch_get_main_queue(), display_image)
}
}
Imgtask.resume()
annotationView = MKPinAnnotationView(annotation: pointAnnoation, reuseIdentifier: "pin")
self.mapView.addAnnotation(annotationView.annotation!)
}
})
}catch{
print("Some error occured")
}
}
// Call the resume() method to start the NSURLSession task
task.resume()
}
func mapView(mapView: MKMapView,
viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?{
let reuseIdentifier = "pin"
var v = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier)
if v == nil {
v = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
v!.canShowCallout = false
}
else {
v!.annotation = annotation
}
let customPointAnnotation = annotation as! LocationClass
v!.image = UIImage(named:customPointAnnotation.pinCustomImageName)
v!.detailCalloutAccessoryView = UIImageView(image: customPointAnnotation.DisplayImage)
return v
}
@IBAction func CallButtontap(sender: AnyObject) {
let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[index]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
UIApplication.sharedApplication().openURL(phoneUrl)
}
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Error while updating location " + error.localizedDescription)
}
我尝试过:
@IBAction func CallButtontap(sender:AnyObject){
let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[index]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
UIApplication.sharedApplication().openURL(phoneUrl)
}
}
它没有工作
最终更新:
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
print("Inside selecting annotation")
LocationView.hidden = false
if let newTitle = view.annotation?.title, let newAddress = view.annotation?.subtitle, let AddressNewImage = view.detailCalloutAccessoryView {
AddressTitleLabel.text = newTitle
AddressSubtitleLabel.text = newAddress
//setting callout accessory as image to UIImage
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0);
AddressNewImage.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let NAimage:UIImage = UIGraphicsGetImageFromCurrentImageContext();
AddressImg.image = NAimage
if (view.annotation is Annotation.self) {
var annot: Annotation = view.annotation
var index: Int = self.arrayOfAnnotations.indexOfObject(annot)
CallButtontap(index)
}
}
}
@IBAction func CallButtontap(sender:AnyObject){
let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[sender]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
UIApplication.sharedApplication().openURL(phoneUrl)
}
}
答案 0 :(得分:2)
以下是您的代码的快速版本:
@IBAction func didTapPhoneButton(sender: UIButton) {
// This function will make phone call
let phoneUrl: NSURL = NSURL(string: "telprompt:\(myJson[index]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
UIApplication.sharedApplication().openURL(phoneUrl)
} else {
PCUtilities.showAlertWithTitle("Alert", message: "Call facility is not available!!!", cancelButtonTitle: "OK")
}
}
答案 1 :(得分:0)
尝试以下快速代码:
@IBAction func btn_callTapped(sender: AnyObject) {
let number = "1234567890" //set user number here.
let phoneNumber: String = "telprompt://" + number
UIApplication.sharedApplication().openURL(NSURL(string: phoneNumber)!)
}
代码将让您直接致电,并在通话后返回您的应用程序。
谢谢。