2017-05-04 5 views
-1

デリゲート関数からボタンのBGカラーを更新する必要がありますが、switch文の内部からメインスレッドにアクセスしようとすると、コンパイラエラーが発生します。SWITCHステートメントからメインのGUIスレッドにアクセスする方法は?

コードは

switch (peripheral.state) { 
     case CBManagerStatePoweredOn: 
      NSLog(@"Powered on"); 
      [peripheral startAdvertising:_beaconPeripheralData]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       _adminPageExitBtn.backgroundColor = [UIColor greenColor]; 
      }); 
      break; 
     case CBManagerStatePoweredOff: 
      NSLog(@"Powered Off"); 
      [peripheral stopAdvertising]; 
      break; 
     case CBManagerStateUnsupported: 
      NSLog(@"Device not supported"); 
      break; 
     default: 
      break; 
    } 

以下のよう

/Users/mdouhan/Documents/Documents - Mattias’s MacBook/NWMobileTill/NWMobileTill/AdminView.m:161:9: Cannot jump from switch statement to this case label 
/Users/mdouhan/Documents/Documents - Mattias’s MacBook/NWMobileTill/NWMobileTill/AdminView.m:150:55: Jump enters lifetime of block which strongly captures a variable 

を次のようにエラーメッセージがあるどのように私は正しくそのデリゲートメソッドからの私のボタンのBG色を更新していますか?

+0

ケースを中括弧で囲みます。スコープを明示的に定義する必要がある前に問題がありました。 Ex: 'case CBManagerStatePoweredOn:{/ *ここでコードとブロック* /} break;' – Stonz2

+0

エラーメッセージは削除されますが、ボタンは色は変わりませんが、CASEがヒットしたことを示すデバッグが表示されます –

+0

そして、ボタンが正しく接続されていますか?メインスレッドのどこかでボタンの色を変更しようとすると、それは機能しますか? – Stonz2

答えて

0

コードが正しいように見えます。私の推測では、コンセントは接続されていないということです。

コール内のNSLog文を追加してみてください:

switch (peripheral.state) { 
    case CBManagerStatePoweredOn: 
    NSLog(@"Powered on"); 
    [peripheral startAdvertising:_beaconPeripheralData]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //------------------------------------------------- 
     //Add the line below 
     NSLog("_adminPageExitBtn = %@", _adminPageExitBtn); 
     //------------------------------------------------- 
     _adminPageExitBtn.backgroundColor = [UIColor greenColor]; 
    }); 
    break; 

...

それがnilを表示する場合は、Interface Builderでアウトレットを接続する必要があります。

+0

ok、2017-05-04 22:47:24.296989 NWMobileTill [580:91086]メインキューの_adminPageExitBtn = > –

+1

OPは実行時エラーではなく、コンパイラエラーを記述していました。 – bbum

+1

@bbum、あなたがコメントに従えば、OPは "それはエラーメッセージを削除しますが、ボタンは色は変わりませんが、デバッグはCASEがヒットしたことを私に見せてくれます - Matt Douhanは6時間前です"。だから、彼はコンパイラのエラーを過ぎてしまえば、彼は新しいランタイムエラーが発生しました。それが私の反応です。 @DuncanC。 –

1

範囲が奇妙な場合のCスコープの定義によって範囲。

または、具体的には、case文でスコープを定義しません。スコープはswitch(){...}によって定義され、ケースは実際には標準ラベルであり、スイッチはgotoスタイルを使って正しいラベルにジャンプします。ブロック宣言の働きにより、スイッチのジャンプ動作が妨げられます。

switch (peripheral.state) { 
     case CBManagerStatePoweredOn: 
     { 
      NSLog(@"Powered on"); 
      [peripheral startAdvertising:_beaconPeripheralData]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       _adminPageExitBtn.backgroundColor = [UIColor greenColor]; 
      }); 
     } 
      break; 
     case CBManagerStatePoweredOff: 
     { 
      NSLog(@"Powered Off"); 
      [peripheral stopAdvertising]; 
     } 
      break; 
     case CBManagerStateUnsupported: 
     { 
      NSLog(@"Device not supported"); 
     } 
      break; 
     default: 
      break; 
    } 

あるいは、単にそれぞれの場合にメソッドを呼び出す:

クリーンな修正は、単に、すべての場合は、固有の範囲を有することを保証することです。 [self peripheralPoweredOn];,[self peripheralPoweredOff];および[self peripheralUnsupported];

このようにして、スコープの問題を解決するだけでなく、他のものがスイッチ/ケース処理を超えて周辺機器の状態をより簡単に駆動できるようにしています。

+0

まだ動作しませんが、実際にクリックしてビューを終了するまで、ボタンは緑色に変わりません。その後、ビューを出る前に約1/10秒間緑色に変わります。 –

+0

変更後に 'setNeedsDisplay'背景色。 – bbum

+0

はまだ動作しません。ボタンが押されるまでボタンは元の色のままです。アプリがそのビューを終了している間、1/10秒間緑色に変わります。 –

関連する問題