2015-06-10 21 views
5

Sono un utente relativamente nuovo e rapido, ora ho bisogno di sfruttare il sensore di prossimità di un iPhone. Non importa la distanza, ma voglio sapere quando qualcosa è vicino all'iPhone.Sensore di prossimità in Swift (da Objective-C)

Quindi ho trovato questo codice in Objective-C che funzionava, ma ne ho bisogno in Swift. Ho provato alcuni modi, ma nessuno ha funzionato. Così qui è il codice che ho bisogno:

- (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: Quello che ho provato è stato questo:

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

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

e la funzione:

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

quello che ho messo nella funzione viene eseguito sempre quando l'app viene eseguita.

EDIT 2: Cercando il codice di Eric D. commento

mi genera l'eccezione: exception xcode throw me

La speranza che qualcuno possa aiutare,

Grazie in anticipo!

+0

mostrare ciò che si è tentato? Forse eri vicino a una soluzione. – Moritz

+0

Sì, modifica la domanda ora! :) –

+0

Per il tuo Edit2: sì, il problema è che tu dichiari 'let sensor = MySensor()' all'interno di 'viewDidLoad', ma non appena' viewDidLoad' termina la sua esecuzione, il tuo 'sensore' viene liberato dalla memoria, e in seguito quando l'osservatore delle notifiche attiva la notifica, non riesce a trovare il tuo oggetto, quindi si blocca. Dovresti dichiarare 'let sensor = MySensor()' al di fuori di 'viewDidLoad', a livello globale o in una classe che puoi raggiungere in qualsiasi momento. – Moritz

risposta

3

Ecco la mia opinione su questo.

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

Grazie! Lo proverò ora e ti dirò qualcosa! –

+0

Ho apportato una piccola modifica: modificato i metodi di classe in metodi di istanza, per seguire meglio l'esempio di codice originale. – Moritz

+0

L'ho provato e quando ho messo la mano davanti al sensore prossimale, il xCode passa all'AppDelegate dicendomi: Thread 1: EXC_BAD_ACCESS (codice = 1, indirizzo = 0x0) –

2

Infine ho farlo funzionare con la risposta di Eric D.

Ecco il codice:

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

e nel viewDidLoad:

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

Speranza che aiuta !

+0

Fatto, l'ho fatto perché non sapevo che lo avresti modificato. Un'altra cosa, lo sai se è possibile che una volta abbia rilevato qualcosa, posso disabilitarlo (non solo questo device.proximityMonitoringEnabled = false). Funziona ma se mantengo qualcosa vicino al sensore di prossimità, il mio telefono si spegne finché non tengo la mia mano fuori da il sensore. C'è un modo per non farlo? Grazie un'altra volta! –

4

Swift 3 Versione

(Basato su 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!") 
    } 
}