奇怪的是,uibuttons文本标签不会改变

时间:2010-11-30 14:26:50

标签: objective-c cocoa uibutton

这很奇怪。我的视图是接收带有索引号的通知,我用它来按标签查找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];
            });
        }

    }

}

2 个答案:

答案 0 :(得分:2)

尝试放

  [changebut setTitle:@"idle" forState:UIControlStateNormal];
。如果它也不起作用,请确保所有插座都在IB中连接。此外,尝试在.xib文件中添加一些空格作为按钮标题(如果有的话)。

答案 1 :(得分:0)

-receiveEvent是否在主线程上调用了另一个?必须在主线程上执行UI更改。