Это очень странно. Мой взгляд получает уведомление с индексом, который я использую, чтобы найти 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];
});
}
}
}