2017-05-04 89 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秒 –