2015-06-27 20 views
14

Tôi có lớp sau được viết trong phiên bản trước của Swift. Các Swift 2 biên dịch cảnh báo rằng'kABPersonAddressStreetKey' không được dùng nữa trong iOS 9.0: sử dụng CNPostalAddress.street

'kABPersonAddressStreetKey' đã bị phản đối trong iOS 9.0: sử dụng CNPostalAddress.street

và đưa ra một lỗi

'Không thể tìm thấy một initializer đối với loại 'MKPlacemark' chấp nhận danh sách đối số loại '(tọa độ: CLLocationCoordinate2D, addressDic tionary: [String: String?]) '

Tôi nhận thấy rằng tùy chọn được yêu cầu để giải quyết lỗi nhưng bất kỳ điều gì tôi cố gắng dường như không giải quyết được sự cố. Điều này là do tôi là một newbie để nhanh chóng và giúp đỡ bất kỳ sẽ được đánh giá cao.

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 
    } 
} 

Trả lời

34

Thay import AddressBook với import Contacts và cũng thay String(kABPersonAddressStreetKey) với 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

Bạn nên sử dụng:

  1. import Contacts thay import AddressBook.
  2. CNPostalAddressStreetKey thay vì kABPersonAddressStreetKey.
+1

Đây là câu hỏi cũ với câu trả lời đã được đánh giá cao. Câu trả lời của bạn khác với câu trả lời được chấp nhận như thế nào? – JAL

1

Bạn cần phải cast phụ đề của bạn như AnyObject như hình dưới đây:

hãy addressDict = [String (kABPersonAddressStreetKey): self.subtitle như! AnyObject]

và mã hoàn chỉnh của bạn cho "func mapItem() -> MKMapItem {}" sẽ là:

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

Filed một Radar về vấn đề này. Nhận được phản ứng này ngày hôm nay:

kỹ thuật đã cung cấp các thông tin sau về vấn đề này: Hãy biết rằng bạn nên tiếp tục sử dụng các phím bị phản đối.

Các vấn đề liên quan