2017-05-04 82 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 

如何正確更新我的按鈕從委託方法的背景色?

+0

嘗試將大小寫包裝在大括號中。在您必須明確定義範圍之前,我遇到了問題。例如:'case CBManagerStatePoweredOn:{/ * code and block here * /} 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; 

...

如果顯示爲零,則需要出口連接在Interface Builder。

+0

看起來不錯,2017-05-04 22:47:24.296989 NWMobileTill [580:91086]主隊列中的_adminPageExitBtn = > –

+1

OP正在描述編譯器錯誤,而不是運行時錯誤。 – bbum

+1

@bbum,如果你按照評論,OP說:「這將刪除錯誤消息,但按鈕不會改變顏色,但調試顯示CASE被擊中 - 馬特杜漢6小時前」。所以一旦他超過編譯器錯誤,他有一個新的運行時錯誤。這就是我的反應。 –

1

根據C規範的定義,case語句的範圍很奇怪。

或更具體地說,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秒 –