10
votes

Swift App se bloque avec `Sélecteur non reconnu envoyé à l'instance` sur CllouerManager

Semblable à beaucoup, de nombreuses autres questions sur Stackoverflow, je reçois un sélecteur non reconnu envoyé à l'instance code> Défaut, lors de l'exécution de mon application. Ce qui rend mon cas différent (je pense) est qu'il est écrit à Swift et que la raison commune n'est pas la raison ici.

in Cette question La solution consiste à définir la" classe personnalisée "dans l'inspecteur d'identité à cette vue sur la classe répondante. J'ai vérifié ceci et c'est le cas (note que j'ai renommé la classe à un moment donné, mais il est désormais défini sur "ViewController"). P>

I Inclure la trace de la pile ci-dessous ainsi que le code Pour ViewController.swift code>. Vous pouvez également trouver tout le code ici . J'ai réussi à éviter ce problème en commençant frais, ce qui m'a permis de résoudre mon Question antérieure . Ce nouvel essai peut être trouvé dans Cette branche . Mais, je veux savoir ce qui ne va pas et résoudre ce problème. P>

Quelques réflexions h2>

Une question que je ne pouvais pas répondre avec succès est si CLLocationManagerDelegate code> a besoin de Méthodes requises? Mais parce que je l'ai eu pour travailler dans l'autre branche, je soupçonne que ce n'est pas nécessaire. P>

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
    @IBOutlet var mapview: MKMapView = nil
    var locationmgr : CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        locationmgr = CLLocationManager()
        locationmgr.delegate = self
        locationmgr.requestWhenInUseAuthorization() ///< Offending line.
//        mapview.showsUserLocation = true
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


7 commentaires

Assurez-vous de tester sur iOS 8.x. Et non sur iOS 7.x ou ci-dessous. "DemandeQueinUathorisation" est disponible dans iOS 8.x.


... ou gardez l'appel en vérifiant si le sélecteur existe (n'a pas encore commencé avec Swift, dans Obj-C, il serait [EmplacementMgr HeamPstoselector: @Selector (requestwheninUuthorizorization)] )


Juste pour information, vous pouvez le faire à Swift en utilisant: EmplacementMgr.RequestQueinUneAuthorisation? (). Noter la "?" avant "()". Ces chèques si l'API est disponible, si oui l'appelez, sinon ne rien faire.


@gagarwal, merci, mais le "?" devrait être après le nom d'objet comme si emplacementmgr? .RequestwheninUneAuthorize () . J'ai comme ça et ça marche.


"EmplacementMgr? .requestwheninUneAuthorisation ()". Vous avez ici "?" Après "locationMgr". Cela signifie que si "EmplacementMgr" n'est pas nulle, allez-y et exécutez API, mais si cette API sur le "EmplacementMgr" n'est pas disponible. Vous obtiendrez «sélecteur non reconnu envoyé à l'instance».


@gagarwal, essayant comme vous le dites, je reçois une erreur de construction: "Opérande de Postfix '?' devrait avoir un type optionnel; type est '0 -> void' "


Malheureusement, cela fonctionne sur les fonctions @Optional dans un protocole: Stackoverflow.com/questions/24167791/...


3 Réponses :


19
votes

Ce code ne fonctionnera pas sur iOS 7 et ci-dessous - selon les docs, requestwheninUserAuthoriorisation est uniquement disponible sur iOS 8:

Disponibilité:

disponible dans iOS 8.0 et ultérieure.


3 commentaires

Qu'est-ce que je dois faire, pour le faire courir dans iOS7? J'ai besoin de cela, sinon je dois déplacer mon iPhone vers iOS8 et je l'utilise quotidiennement. Donc, je préfère ne pas viser iOS8.


Puis-je tout simplement pas appeler cette fonction? Je le fais maintenant dans iOS7 et vérifié avec le simulateur IOS8, mais j'aimerais une réponse absolue.


Il suffit d'appeler la fonction de demande si le cllouerManager ne répond pas à ce sélecteur. Vous obtenez implicitement une autorisation toujours dans iOS7. Utilisez ReseplStoselector pour voir si vous devez l'appeler.



32
votes

comme requestwheninuseAuthoriorisation code> est uniquement disponible sur iOS 8 (selon Apple Documentation ) Vous devez l'envelopper:

Code SWIFT: strong> P>

if ([locationmgr respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [locationmgr requestWhenInUseAuthorization];
}


0 commentaires

0
votes

Voici ce que j'utilise pour prendre en charge la nouvelle méthode de localisation de base dans iOS 7 sans erreur:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([locationManager respondsToSelector:requestSelector]) {
   [locationManager performSelector:requestSelector withObject:NULL];
}


0 commentaires