2017-06-24 4 views
-2

私は時間とバッテリーのレベルを表示するだけの簡単なアプリを開発中です。時間の部分は完璧に動作し、私はバッテリーのレベルを監視することができますが、デバイスのバッテリーに変更があると、バッテリーインジケーターアイコンがアプリケーションをクラッシュさせます。ここでは、関連するコードがあります:バッテリー残量が変わると未知のNSExceptionが発生する

override func viewDidLoad() { 
    super.viewDidLoad() 
    UIDevice.current.isBatteryMonitoringEnabled = true // Enable battery monitoring 
    NotificationCenter.default.addObserver(self, selector: Selector(("batteryStateDidChange:")), name: NSNotification.Name.UIDeviceBatteryStateDidChange, object: nil) // Add battery state checker 
    NotificationCenter.default.addObserver(self, selector: Selector(("batteryLevelDidChange:")), name: NSNotification.Name.UIDeviceBatteryLevelDidChange, object: nil) // Add battery level checker 
    // Get the battery level 
    var batteryLevel: Int { 
     return Int(UIDevice.current.batteryLevel * 100) 
    } 
    update() 
    timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) // Start the timed scheduler 
} 

ここでエラーです:

2017-06-24 11:45:27.783761-0500 SimpleClock[1484:846193] -[SimpleClock.ViewController batteryLevelDidChange:]: unrecognized selector sent to instance 0x15dd15bc0 
2017-06-24 11:45:27.785656-0500 SimpleClock[1484:846193] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SimpleClock.ViewController batteryLevelDidChange:]: unrecognized selector sent to instance 0x15dd15bc0' 
*** First throw call stack: 
(0x181c65858 0x18043c528 0x181c72a6c 0x188815140 0x181c6af68 0x181b4ce5c 0x181bf3004 0x181bf25a4 0x181bf2308 0x181c74268 0x181b2a4e4 0x1826f32d4 0x1884abd60 0x1884abbc8 0x181ecdaf0 0x181beda68 0x181c0cbc8 0x181c0c370 0x181c09d80 0x181b28280 0x183639f94 0x1884d70f0 0x100da10e4 0x180919e40) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 
+3

コードへのリンクを投稿しないでください。あなたの質問を関連コードでテキストとして[編集]します。 – rmaddy

+2

エラーメッセージ* batteryLevelDidChange:]:認識できないセレクタ... *はかなり明確です。メソッドが見つからないか、シグネチャが間違っています。 – vadian

+0

PS:Swiftの '#selector'ネイティブ構文を使用します。利点は、コンパイル時にエラーが発生することです。 – vadian

答えて

1

-[SimpleClock.ViewController batteryLevelDidChange:]: unrecognised selectorエラーがbatteryLevelDidChange関数がコード内で欠落しているかヴァディアンはコメントとして、署名が間違っていることを示しています。

0

batteryStateDidChange:セレクタのオブザーバを追加する前にif conditionを使用してください。これにはrespondsToSelector:メソッドを使用できます。セレクタが実装されているかどうかを確認できます。

また、ソースファイルにセレクタを実装する必要があります。コードでは表示されないため、unrecognised selectorエラーが発生します。

希望すると助かります!

+0

'respondsToSelector:'はObjective-Cの古い習慣です。 Swiftでは、コンパイラはコンパイル時にターゲット/アクションセレクタをチェックできます。 – vadian

+0

私はSwiftでもiOSとの後方互換性のために使用する必要があると思います。しかし、Swiftでは '? 'を使用することもできます。 –

+0

いいえ、実行時にスウィフトでこれらのことをすべて確認する必要はありません。推奨される '#selector'構文を使用すると、コンパイラはコンパイル時に対応するメソッドをチェックします。 – vadian

関連する問題