这很奇怪。我的视图是接收带有索引号的通知,我用它来按标签查找UI按钮,然后更改其文本标签。唯一的麻烦是文本不会改变。我已经加入了断点并且代码正在执行。
使用通知时是否存在一些与变量范围有关的特性?
- (void)receiveEvent:(NSNotification *)notification {
int pass = [[[notification userInfo] valueForKey:@"index"] intValue];
NSLog(@"button index is %i", pass);
UIButton *changebut = (UIButton *) [self.view viewWithTag:pass];
ButtonStatusModel *m= [self.buttoneventpendingarray objectAtIndex:pass];
NSLog(@"current but status = %i",m.btnstatus);
if (m.btnstatus==3 ) {
//this should change the label but it does not;
[changebut setTitle:@"playing" forState:UIControlStateNormal];
m.btnstatus=2;
NSLog(@"should set text to 'playing");
//[engine addActionToQue:buttonid actionSample:actionsample action:1];
}else if (m.btnstatus==1) {
//this should change the label but it does not;
[changebut setTitle:@"idle" forState:UIControlStateNormal];
NSLog(@"should set text to 'idle");
m.btnstatus=0;
//[engine addActionToQue:buttonid actionSample:actionsample action:0];
}
}
编辑1 感谢评论者,我已经确定即使我的主视图控制器上的reciveevent函数没有从主线程执行(也不是真的理解这个),所以这就是为什么按钮标签不会改变。
我使用以下代码来确定它是否是主线程。我想现在改变我需要在主线程上调用执行选择器的按钮标签?这是正确的做法吗?如果是这样我需要传递一个函数2变量,我不知道主线程上的执行选择器如何适应这个。
-(void) updatebutton:(int)tag changeto:(int) val
{
if ([NSThread isMainThread]) {
{
NSLog(@"is main thread");
}
} else {
NSLog(@"is not thread");
[self performSelectorOnMainThread:@selector( /*function with 2 parameters here*/) withObject:nil waitUntilDone:YES];
}
}
编辑3 *
使用块而不是主选择器帮助我解决了问题。
我真的不明白整个主线程。我假设如果代码在我的视图控制器中,任何执行的代码都将在主线程上执行。这似乎是一个很大的错误。我很感激对此事的一点启示。
继承我用过的东西
-(void) updatebutton:(int)tag changeto:(int) val
{
UIButton *changebut = (UIButton *) [self.view viewWithTag:tag];
if ([NSThread isMainThread]) {
{
NSLog(@"is main thread");
if (val==2) {
[changebut setTitle:@"playing" forState:UIControlStateNormal];
}
if (val==0) {
[changebut setTitle:@"idle" forState:UIControlStateNormal];
}
}
} else {
NSLog(@"is not thread");
//[self performSelectorOnMainThread:@selector(updatebutton::) withObject:nil waitUntilDone:YES];
if (val==2) {
dispatch_async(dispatch_get_main_queue(), ^{
[changebut setTitle:@"playing" forState:UIControlStateNormal];
});
}
if (val==0) {
dispatch_async(dispatch_get_main_queue(), ^{
[changebut setTitle:@"idle" forState:UIControlStateNormal];
});
}
}
}
答案 0 :(得分:2)
尝试放
[changebut setTitle:@"idle" forState:UIControlStateNormal];
答案 1 :(得分:0)
-receiveEvent
是否在主线程上调用了另一个?必须在主线程上执行UI更改。