2015-06-27 2 views
14

Ho la seguente classe scritta in una versione precedente di Swift. Il Swift 2 compilatore avverte che'kABPersonAddressStreetKey' era obsoleto in iOS 9.0: utilizzare CNPostalAddress.street

'kABPersonAddressStreetKey' stata sconsigliata a iOS 9.0: utilizzare CNPostalAddress.street

e dà un errore

'Non riesco a trovare un inizializzatore per tipo 'MKPlacemark' che accetta un elenco di argomenti di tipo '(coordinate: CLLocationCoordinate2D, addressDic tionary: [String: String?]) '

Mi rendo conto che sono necessari gli optionals per risolvere l'errore ma qualsiasi cosa provi non sembra risolvere il problema. Ciò è dovuto al fatto che io sono un novizio veloce e ogni aiuto sarebbe apprezzato.

import Foundation 
import MapKit 
import AddressBook 

class Artwork: NSObject, MKAnnotation { 
let title: String? 
let locationName: String 
let discipline: String 
let coordinate: CLLocationCoordinate2D 

init(title: String, locationName: String, discipline: String, coordinate: CLLocationCoordinate2D) { 
    self.title = title 
    self.locationName = locationName 
    self.discipline = discipline 
    self.coordinate = coordinate 

    super.init() 
} 

var subtitle: String? { 
    return locationName 
} 

// annotation callout info button opens this mapItem in Maps app 
func mapItem() -> MKMapItem { 
    let addressDictionary = [String(kABPersonAddressStreetKey): subtitle] 
    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary) 

    let mapItem = MKMapItem(placemark: placemark) 
    mapItem.name = title 

    return mapItem 
    } 
} 

risposta

34

Sostituire import AddressBook con import Contacts e anche sostituire String(kABPersonAddressStreetKey) con String(CNPostalAddressStreetKey)

import Foundation 
import MapKit 
import Contacts 

class Artwork: NSObject, MKAnnotation { 
let title: String? 
let locationName: String 
let discipline: String 
let coordinate: CLLocationCoordinate2D 

init(title: String, locationName: String, discipline: String,  coordinate: CLLocationCoordinate2D) { 
    self.title = title 
    self.locationName = locationName 
    self.discipline = discipline 
    self.coordinate = coordinate 

    super.init() 
} 

var subtitle: String? { 
    return locationName 
} 

// annotation callout info button opens this mapItem in Maps app 
func mapItem() -> MKMapItem { 
    let addressDictionary = [String(CNPostalAddressStreetKey): self.subtitle!] 
    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary) 
    let mapItem = MKMapItem(placemark: placemark) 
    mapItem.name = title 

    return mapItem 

} 
2

Si dovrebbe usare:

  1. import Contacts invece import AddressBook.
  2. CNPostalAddressStreetKey invece kABPersonAddressStreetKey.
+1

Questa è una vecchia domanda con una risposta già altamente motivata. In che modo la tua risposta differisce dalla risposta accettata? – JAL

1

È necessario lanciare i sottotitoli come ANYOBJECT come illustrato di seguito:

lasciare addressDict = [String (kABPersonAddressStreetKey): self.subtitle come! ANYOBJECT]

e il codice completo per "func mapItem() -> MKMapItem {}" saranno:

func mapItem() -> MKMapItem { 
    let addressDict = [String(kABPersonAddressStreetKey): self.subtitle as! AnyObject] 
    let placemark = MKPlacemark(coordinate: self.coordinate, addressDictionary: addressDict) 

    let mapItem = MKMapItem(placemark: placemark) 
    mapItem.name = self.title 

    return mapItem 
    } 
2

depositato un radar su questo. Ha ottenuto questa risposta oggi:

Engineering ha fornito le seguenti informazioni riguardo a questo problema: Si prega di sapere che è necessario continuare a utilizzare i tasti deprecate.