2015-06-19 16 views
9

Tôi đang cố triển khai chế độ xem bản đồ cơ bản và thêm vị trí hiện tại của người dùng vào bản đồ dưới dạng chú thích. Tôi đã thêm khóa requestwheninuse vào info.plist và coreLocation đã nhập của mình.xử lý quyền vị trí ngay lập tức trong swift

Trong phương pháp tải đã điều khiển quan điểm của tôi, tôi có như sau:

locManager.requestWhenInUseAuthorization() 
var currentLocation : CLLocation 

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){ 

    currentLocation = locManager.location 
    println("currentLocation is \(currentLocation)")  
} 
else{ 
    println("not getting location") 
    // a default pin 
} 

Tôi nhận lại nhắc. quyền truy xuất vị trí. Vì điều này đang xảy ra, tôi nhận được bản in của tôi nói rằng không nhận được vị trí, rõ ràng là vì điều này chạy trước khi người dùng có cơ hội nhấn OK. Nếu tôi yêu thích ứng dụng và quay trở lại, tôi có thể truy xuất vị trí và thêm nó vào bản đồ. Tuy nhiên, tôi muốn khi người dùng nhấn OK lần đầu tiên để có thể sau đó lấy vị trí hiện tại và thêm nó vào bản đồ ở đó và sau đó. Làm thế nào tôi có thể đạt được điều này? Tôi có phương pháp sau đây để thêm một pin:

func addPin(location2D: CLLocationCoordinate2D){ 
    self.mapView.delegate = self 
    var newPoint = MKPointAnnotation() 
    newPoint.coordinate = location2D 
    self.mapView.addAnnotation(newPoint) 
} 

Trả lời

22

Để làm được điều đó, bạn cần phải thực hiện các phương pháp didChangeAuthorizationStatus cho đại biểu quản lý vị trí của bạn được gọi là một thời gian ngắn sau khi CLLocationManager được khởi tạo.

Thứ nhất, ở phía trên cùng của tập tin đừng quên thêm: import CoreLocation

Để làm điều đó, trong lớp học của bạn mà bạn đang sử dụng vị trí, thêm các giao thức đại biểu. Sau đó, trong viewDidLoad phương pháp (hoặc applicationDidFinishLaunching nếu bạn đang ở trong AppDelegate) khởi tạo quản lý vị trí của bạn và thiết lập của nó delegate tài sản để self:

class myCoolClass: CLLocationManagerDelegate { 
    var locManager: CLLocationManager! 

    override func viewDidLoad() { 
     locManager = CLLocationManager() 
     locManager.delegate = self 
    } 
} 

Cuối cùng, thực hiện các phương pháp trong cơ thể của locationManager (_ didChangeAuthorizationStatus _) của bạn lớp mà bạn đã khai báo trước đó, phương thức này sẽ được gọi khi trạng thái của ủy quyền được thay đổi, vì vậy ngay sau khi người dùng của bạn nhấp vào nút. Bạn có thể thực hiện nó như thế này:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status { 
    case .NotDetermined: 
     // If status has not yet been determied, ask for authorization 
     manager.requestWhenInUseAuthorization() 
     break 
    case .AuthorizedWhenInUse: 
     // If authorized when in use 
     manager.startUpdatingLocation() 
     break 
    case .AuthorizedAlways: 
     // If always authorized 
     manager.startUpdatingLocation() 
     break 
    case .Restricted: 
     // If restricted by e.g. parental controls. User can't enable Location Services 
     break 
    case .Denied: 
     // If user denied your app access to Location Services, but can grant access from Settings.app 
     break 
    default: 
     break 
    } 
} 

Swift 4 - enum New cú pháp

Đối Swift 4, chỉ cần chuyển các chữ cái đầu tiên của từng trường hợp enum thành chữ thường (.notDetermined, .authorizedWhenInUse, .authorizedAlways , .restricted and .denied)

Bằng cách đó bạn có thể xử lý từng trường hợp, cho dù người dùng chỉ cho phép hoặc thu hồi nó.

+0

Cảm ơn bạn đã phản hồi. Các dòng locManger.delegate = tự cho tôi một lỗi 'dự kiến ​​khai báo' – user2363025

+0

@ user2363025 bạn có thể xây dựng? Nhấp vào lỗi và nó sẽ cho bạn biết thêm –

+0

Đó là tất cả các lỗi nói. Không có thông tin bổ sung nào xuất hiện khi di chuột qua. Tôi thấy ở đây http://stackoverflow.com/questions/24121761/how-to-use-corelocation-with-swift mà có lẽ tôi phải định nghĩa locManager trong appdelegate? Tôi cũng nhận được lỗi trong mọi trường hợp của câu lệnh switch nói rằng mỗi phương thức không thể được gọi là không có đối số cho dù tôi đã định nghĩa locManager trong appdelegate hoặc bộ điều khiển xem của tôi – user2363025

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