0

私はMapBoxNavigation.swiftを使用して、ユーザーを特定の場所に誘導するアプリケーションを構築しています。ナビゲーションが始まる時点まで、すべて正常に動作します。ナビゲーションを開始しMapBoxNavigation.swiftは(ライブラリがどのように動作するかのマニュアルを参照してください)ポストNSNotificationを発するときしかし、私が書いたオブザーバーは、このエラーメッセージがスローされます。セレクタの名前が正しく指定されていても、

app[49184:2686603] -[__NSCFConstantString navProgressDidChange:]: unrecognized selector sent to instance 0x1096dfdb0 

これはMapBoxNavigationからの通知をポストコードです。 SWIFT:

NotificationCenter.default.post(name: RouteControllerAlertLevelDidChange, object: self, userInfo: [ 
     RouteControllerAlertLevelDidChangeNotificationRouteProgressKey: routeProgress, 
     RouteControllerAlertLevelDidChangeNotificationDistanceToEndOfManeuverKey: userDistance, 
     RouteControllerProgressDidChangeNotificationIsFirstAlertForStepKey: isFirstAlertForStep 
     ]) 

これは、必要なすべてのコードのようになります。

import Foundation 
import UIKit 
import Mapbox 
import MapboxDirections 
import MapboxNavigation 
import CoreLocation 
import Alamofire 
import SWXMLHash 
import DateTimePicker 

//Primary ViewController, used for basically everything 
class ViewController: UIViewController, MGLMapViewDelegate, CLLocationManagerDelegate, UITextFieldDelegate, UIGestureRecognizerDelegate { 

    lazy var geocoder = CLGeocoder() 
    @IBOutlet weak var addressTextField: SearchTextField! //SearchTextField 
    @IBOutlet var mapView: MGLMapView! //MapView of MapBox  

    @IBOutlet weak var BookingUIView: UIView! 
    @IBOutlet weak var BookingView: UIView! 

    //Used to geocode the Addresses 
    let locationManager = CLLocationManager() 
    var searched = false 
    var keyboardEnabled = false 
    var navigationStarted = false 


    //Getting the route object 
    let directions = Directions.shared 
    let waitForInterval: TimeInterval = 5 

    @IBOutlet weak var arrivalTimeLabel: UILabel! 
    @IBOutlet weak var arrivalTimeButton: UIButton! 
    @IBOutlet weak var leaveTimeButton: UIButton! 
    @IBOutlet weak var searchAddressButton: UIButton! 


    /* Overriding Super-Functions */ 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     // This is needed.... i don't know why.. 
     mapView.delegate = self 

     //Delegate textField to Self 
     addressTextField.delegate = self 

     //Dismiss Keyboard on view Touch 
     //Looks for single or multiple taps. 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) 
     self.mapView.addGestureRecognizer(tap) 
     //Delegate GestureRecognizer to self 
     tap.delegate = self 

     //Get the users current location and zoom to it 
     //Authorization stuff #privacy 
     self.locationManager.requestWhenInUseAuthorization() 
     //initialize the updating of the location 
     if(CLLocationManager.locationServicesEnabled()){ 
      locationManager.delegate = self 
      locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation 
      locationManager.startUpdatingLocation() 
     } 

     //Adding TextViewListener 
     addressTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 

     //Registering PresentNavigationViewControllerObserver :3 
     NotificationCenter.default.addObserver(self, selector: #selector(self.enableNavigationMode), name: NSNotification.Name(rawValue: "StartNavigation"), object: nil) 
    } 
func enableNavigationMode(){ 
     //Hiding some elements here 
     startNavigation() //Gets called properly 
    } 


    func navProgressDidChange(_ userInfo: NSNotification){ 
     print("depart") 
     print(userInfo) 
    } 

    func startNavigation(){ 
     //Get the JSON File via the MapBox API 
     var lat = locationManager.location?.coordinate.latitude 
     var long = locationManager.location?.coordinate.longitude 
     var depart = CLLocation(latitude: lat!, longitude: long!) 
     var start = Waypoint(coordinate: CLLocationCoordinate2D(latitude: lat!, longitude: long!)) 
     var end = Waypoint(coordinate: CLLocationCoordinate2D(latitude: Shared.shared.selectedParkhouse.latitude, longitude: Shared.shared.selectedParkhouse.longitude)) 

     var string = "https://api.mapbox.com/directions/v5/mapbox/driving-traffic/" + String(describing: long!) + "%2C" + String(describing: lat!) + "%3B" + String(describing: Shared.shared.selectedParkhouse.longitude) + "%2C" + String(describing: Shared.shared.selectedParkhouse.latitude) + ".json?access_token=mykey;)&steps=true" 

//Alamofire request works properly 
     Alamofire.request(string).responseData { response in 
      if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 

       let jsoninput = self.convertToDictionary(text: utf8Text)! 
       let jsonroute = (jsoninput["routes"] as! [AnyObject]).first as! [String:Any] 

       let route = Route(json: jsonroute, waypoints: [start, end], profileIdentifier: MBDirectionsProfileIdentifierAutomobileAvoidingTraffic) 
       let routecontroller = RouteController(route: route) 

       print("regging") 
       NotificationCenter.default.addObserver(RouteControllerAlertLevelDidChange, selector: #selector(self.navProgressDidChange(_:)), name: RouteControllerAlertLevelDidChange, object: routecontroller) 
       print("resuming") 
       routecontroller.resume() 
       print("updating(?)") 
       //Everything is fine until this function gets called and 
       //MapBoxNavigation.swift posts a Notification 

       routecontroller.locationManager(routecontroller.locationManager, didUpdateLocations: [depart]) 

      } 
     } 
    } 

私はいくつかのティムNotificationCenterを使用しました私はここに来て助けに来ているのです。私はまた、navProgressDidChange(userInfo: Notification)以上のパラメータから、現在のコードにあるものとは異なる関数名とパラメータを試しました。私はこれがなぜ起こるのかわからないし、セレクタが私にとってうまくいくので、それは私の心の中でも意味をなさない。

これ以上の情報が必要な場合は、尋ねてください。 お返事ありがとうございました!ここ

+0

'self 'または' ViewController'(ClassName)を指定せずに両方とも試してみます。関数が直接識別できないため、XCodeはエラーを報告します。また、その前に 'ViewController'を置くと動作しません。 – njoye

+0

名前は 'ViewController'です、送信するクラスは' RouteController'です – njoye

答えて

3

あなたの構文が正しくありません:あなたは、通知に文字列RouteControllerAlertLevelDidChangeをサブスクライブしている

NotificationCenter.default.addObserver(RouteControllerAlertLevelDidChange, selector: #selector(self.navProgressDidChange(_:)), name: RouteControllerAlertLevelDidChange, object: routecontroller) 

。あなたはselfを購読するつもりだった。エラーメッセージに次のようなエラーメッセージが表示されます。

app[49184:2686603] -[__NSCFConstantString navProgressDidChange:]: unrecognized selector sent to instance 0x1096dfdb0 

メッセージを一定の文字列に送信しようとしていると不平を言っています。

+0

今日は十分な休憩がなかったので、この解決策が働いています。ありがとう! – njoye

関連する問題