как ни странно, текстовая метка uibuttons не изменится - PullRequest
1 голос
/ 30 ноября 2010

Это очень странно. Мой взгляд получает уведомление с индексом, который я использую, чтобы найти UIbutton by tag и затем изменить его текстовую метку. Единственная проблема в том, что текст не изменится. Я поставил точки останова, и код выполняется.

Есть ли какая-то особенность в переменных областях при использовании уведомлений?

- (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 ]

2 голосов
/ 30 ноября 2010

Попробуйте поставить

  [changebut setTitle:@"idle" forState:UIControlStateNormal];

в методе -viewDidAppear. Если это не работает, убедитесь, что все выходы подключены в IB. Кроме того, попробуйте добавить несколько пробелов в качестве заголовка кнопки в файле .xib (если он у вас есть).

0 голосов
/ 06 декабря 2010

Вызывается ли -receiveEvent в другом потоке?Изменения пользовательского интерфейса должны выполняться в главном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...