i have some following json data :
This will all show in map view. So when user press any pins in map. The address, name call button will display.
I have one action method
for that call button
..So if any user press any pin in my map. it will show the Address, name, one call button
... So if user press that call button , it show show the respective or correct phone number of my name and address
and it should show in normal phone dial pad.
I did some what in objective - c. But i am not good in swift 2.0.
Can any one help me out how to do that.
Full code:
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)
}
In that i tried :
@IBAction func CallButtontap(sender: AnyObject) {
let phoneUrl: NSURL = NSURL(string: "telprompt:\(item[index]["phone"])")!
if UIApplication.sharedApplication().canOpenURL(phoneUrl) {
UIApplication.sharedApplication().openURL(phoneUrl)
}
}
It din't work
Final updated:
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)
}
}