「連絡先」から住所データを取得して、MapView上にPinを刺す
ってのが、今回のお題です。
まず、お約束のimport設定とデリゲート設定

import MapKit

class DetailViewController: UIViewController,MKMapViewDelegate{

で、住所データはこちらからこんな感じで持ってるとします。

5320011    // "postalCode"
大阪府     // "state"
大阪市淀川区  //"city"
西中島5-16-1 // "street"

が、どうも、改行マークと郵便番号を削除した文字列で地点変換した方が、正解率が良いような気がするので

 大阪府大阪市淀川区西中島5-16-1

として地点変換するようにしました。

 // MARK: ー 住所から郵便番号文字列と改行を削除する
    func addresOffPostNumber(oadr:String)->String{
       let arr = oadr.componentsSeparatedByString("\n")
       let emailRegex = "[0-9-]+";
       let predicate = NSPredicate(format: "SELF MATCHES %@",emailRegex);
       var nstr:String = "";
       if ( predicate.evaluateWithObject(arr[0]) == true ){
           for an in 1 ..< arr.count {
               nstr = nstr + arr[an];
           }
       }else
       {
            for an in 0 ..< arr.count {
                nstr = nstr + arr[an];
            }
        }
        print("addresOffPostNumber() nstr:\(nstr)");
        return nstr;
    }

で、文字列をコンバートして、地点データに変換します。
地点データの変換は、 CLGeocoder の geocodeAddressString() を利用します。

  var addrLocation: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 34.687315,longitude: 135.526201)    //大阪城のアドレス位置

// MARK: ー 住所を座標に変換する
    let OSAKAJYO_latitude : CLLocationDegrees = 34.687315 //緯度
    let OSAKAJYO_longitude : CLLocationDegrees = 135.526201 //経度
   func addressToLocation(address:String) {
        //デフォルト初期値(現在地が取得できない時のデータ:大阪城)
        self.addrLocation = CLLocationCoordinate2DMake(OSAKAJYO_latitude,OSAKAJYO_longitude)
        
        let myGeocoder:CLGeocoder = CLGeocoder();
        //住所
        let searchStr = address;
        //住所を座標に変換する。
        myGeocoder.geocodeAddressString(searchStr, completionHandler: {(placemarks, error) in
            print("2-1;location ")
            if(error == nil) {
                print("placemarks.count=\(placemarks?.count)")
                
                for placemark in placemarks! {
                    self.addrLocation = CLLocationCoordinate2DMake(placemark.location!.coordinate.latitude
                                                                 , placemark.location!.coordinate.longitude)
                   
                    //地図表示データの設定
                    // — 地図のピン刺し処理 —
                    
                    break; //geocodeAddressString結果が複数個あっても、先頭データのみ表示地点とする
               }
            } else {
                print("addressToLocation()-  2-3 検索できませんでした。: \(searchStr)");
				// 〜〜 error 処理¥  
           }
        })
    }

地点データをクラスメンバの self.addrLocation に保存して Pin刺し処理をcallします。
この時、Pin(AnnotationView)のデータにPinカラーとかcallOut(Pinをタップしたら出てくる吹き出し)の表示データ(ボタンの種類や文言)など持ったカスタムCustomMKPointAnnotationを準備します。

//MKPointAnnotationのカスタム化
class CustomMKPointAnnotation: MKPointAnnotation {
var pinColor:UIColor = UIColor.redColor(); //ピンの色
var balloonType:UIButtonType = UIButtonType.ContactAdd; //BallonRightBtnの種類
var balloonLeftType:UIButtonType = UIButtonType.InfoDark; //BallonLeftBtnの種類
}

//pin刺し処理
// MARK: – Pinをさす
func setMapMarkPin( latitude:CLLocationDegrees,_ longitude:CLLocationDegrees,
titile:String,subTitle:String,
_ pinColor:UIColor = UIColor.redColor(),
_ balloonType:UIButtonType = UIButtonType.ContactAdd )
{
if (pinColor == UIColor.redColor()){

print(“setMapMarkPin– redPin”)
}

//左下のピン
let annotation1 = CustomMKPointAnnotation()
annotation1.coordinate = CLLocationCoordinate2DMake(latitude, longitude);
annotation1.title = titile  //titele:String = “新大阪”
annotation1.subtitle = subTitle //sub_titele:String = “”
annotation1.pinColor = pinColor // pinColor = UIColor.redColor()
annotation1.balloonType = balloonType // balloonType = UIButtonType.DetailDisclosure
mapVw.addAnnotation(annotation1)
}

// この後に、デリゲートがcallされる
// MARK: ====== MKMapViewDelegateのデリゲート======
// MARK: ====== MKMapViewDelegate アノテーションビューを返すメソッド
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
//アノテーションビューを生成する。
let annoPinView = MKPinAnnotationView()
if let anno= annotation as? CustomMKPointAnnotation {
annoPinView.pinTintColor = anno.pinColor
//— 右ボタン
let rightButton: AnyObject! = UIButton(type: anno.balloonType)
annoPinView.rightCalloutAccessoryView = rightButton as? UIView
//経路ボタンをアノテーションビューに追加する。
let button = UIButton()
button.frame = CGRectMake(0,0,40,30)
button.setTitle(“経路”, forState: .Normal)
button.backgroundColor = UIColor.blueColor()
button.setTitleColor(UIColor.whiteColor(), forState:.Highlighted)
testPinView.leftCalloutAccessoryView = button

}

//吹き出しの表示をONにする。
annoPinView.canShowCallout = true

return annoPinView
}
[/swift

結果は、

aka_anno

 

 

 

 

 

 

となりました。ではでは。。