2015-06-10 14 views
5

Ich bin ein relativ neuer Benutzer zu schnell und jetzt muss ich den Näherungssensor eines iPhone nutzen. Die Entfernung spielt keine Rolle, aber ich möchte wissen, wann sich etwas in der Nähe des iPhone befindet.Näherungssensor in Swift (von Objective-C)

So fand ich diesen Code in Objective-C, der funktionierte, aber ich brauche es in Swift. Ich habe einige Wege ausprobiert, aber alle haben funktioniert. So, hier ist der Code, ich brauche:

- (void) activateProximitySensor { 
    UIDevice *device = [UIDevice currentDevice]; 
    device.proximityMonitoringEnabled = YES; 
    if (device.proximityMonitoringEnabled == YES) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) name:@"UIDeviceProximityStateDidChangeNotification" object:device]; 
    } 
} 

- (void) proximityChanged:(NSNotification *)notification { 
    UIDevice *device = [notification object]; 
    NSLog(@"Detectat"); 

    //DO WHATEVER I WANT 
} 

EDIT 1: Was habe ich versucht, war dies:

override func viewDidLoad() { 
     super.viewDidLoad() 
     UIDevice.currentDevice().proximityMonitoringEnabled = true; 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector(proximityStateDidChange()), name:UIDeviceProximityStateDidChangeNotification, object: nil); 
} 

und die Funktion:

func proximityStateDidChange() { 
     //DO WHATEVER I WANT 
} 

Was ich in der Funktion setzen Es wird immer ausgeführt, wenn die App ausgeführt wird.

EDIT 2: Der Versuch, den Code von Eric D. Kommentar

wirft mich die Ausnahme: exception xcode throw me

Hoffnung jemand helfen kann,

Vielen Dank im Voraus!

+0

Zeigen Sie, was Sie versucht? Vielleicht warst du einer Lösung nahe. – Moritz

+0

Ja, ich bearbeite die Frage jetzt! :) –

+0

Für deine Edit2: yeah, das Problem ist, dass du 'let sensor = MySensor()' in 'viewDidLoad' deklarierst, aber sobald' viewDidLoad' die Ausführung beendet, wird dein 'Sensor' vom Speicher und später befreit Wenn der Benachrichtigungsbeobachter die Benachrichtigung auslöst, kann er Ihr Objekt nicht finden und stürzt ab. Sie sollten 'let sensor = MySensor()' außerhalb von 'viewDidLoad' deklarieren, entweder global oder in einer Klasse, die Sie jederzeit erreichen können. – Moritz

Antwort

3

Hier ist meine Meinung zu diesem Thema.

func activateProximitySensor() { 
    let device = UIDevice.currentDevice() 
    device.proximityMonitoringEnabled = true 
    if device.proximityMonitoringEnabled { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "proximityChanged:", name: "UIDeviceProximityStateDidChangeNotification", object: device) 
    } 
} 

func proximityChanged(notification: NSNotification) { 
    if let device = notification.object as? UIDevice { 
     println("\(device) detected!") 
    } 
} 
+0

Danke! Ich werde es jetzt versuchen und dir etwas sagen! –

+0

Ich habe eine kleine Änderung vorgenommen: Klassenmethoden in Instanzmethoden geändert, um besser Ihrem ursprünglichen Codebeispiel zu folgen. – Moritz

+0

Ich habe es versucht und wenn ich meine Hand vor dem proximity Sensor dann die xCode geht auf die AppDelegate und sagt mir: Thread 1: EXC_BAD_ACCESS (code = 1, Adresse = 0x0) –

2

Schließlich bekomme ich es mit der Antwort von Eric D. Arbeits

Hier ist der Code:

func proximityChanged(notification: NSNotification) { 
     if let device = notification.object as? UIDevice { 
      println("\(device) detected!") 
     } 
    } 

    func activateProximitySensor() { 
     let device = UIDevice.currentDevice() 
     device.proximityMonitoringEnabled = true 
     if device.proximityMonitoringEnabled { 
      NSNotificationCenter.defaultCenter().addObserver(self, selector: "proximityChanged:", name: "UIDeviceProximityStateDidChangeNotification", object: device) 
      } 
     } 
    } 

und im viewDidLoad:

override func viewDidLoad() { 
     super.viewDidLoad() 
     activateProximitySensor() 
} 

Hoffe, es hilft !

+0

Fertig, ich tat es, weil ich nicht wusste, dass du es bearbeiten würdest. Noch eine Sache, weißt du Wenn es möglich ist, dass es einmal etwas entdeckt hat, kann ich es deaktivieren (nicht nur dieses device.proximityMonitoringEnabled = false). Das funktioniert, aber wenn ich etwas in der Nähe des Näherungssensors behalte, schaltet sich mein Telefon aus, bis ich meine Hand aus nehme Der Sensor. Gibt es einen Weg, es nicht zu tun? Danke nochmal! –

4

Swift 3 Version

(Basierend auf Eric Aya's answer)

func setProximitySensorEnabled(_ enabled: Bool) { 
    let device = UIDevice.current 
    device.isProximityMonitoringEnabled = enabled 
    if device.isProximityMonitoringEnabled { 
     NotificationCenter.default.addObserver(self, selector: #selector(proximityChanged), name: .UIDeviceProximityStateDidChange, object: device) 
    } else { 
     NotificationCenter.default.removeObserver(self, name: .UIDeviceProximityStateDidChange, object: nil) 
    } 
} 

func proximityChanged(_ notification: Notification) { 
    if let device = notification.object as? UIDevice { 
     print("\(device) detected!") 
    } 
}