UIButton не обновляется - PullRequest
       3

UIButton не обновляется

0 голосов
/ 01 февраля 2011

Я пытаюсь изменить скрытое свойство кнопки, и это делается методом (Просмотреть один):

-(void)changeSong:(NSString *)songName {

    [[SimpleAudioEngine sharedEngine] playBackgroundMusic:[[NSBundle mainBundle] pathForResource:songName ofType:@"mp3"]];
    musicPlaying = YES;
    playButton.hidden = YES;
    pauseButton.hidden = NO;    
}

Этот метод вызывается из другого представления:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    MainMenuController *mainMenu = [[MainMenuController alloc] initWithNibName:@"MainMenu" bundle:nil];
    [mainMenu changeSong:[songs objectAtIndex:indexPath.row]];

    mainMenu = nil;
    [mainMenu release];

    [[self navigationController] popViewControllerAnimated:YES];
}

Я знаю, что метод changeSong вызывается правильно, потому что музыка меняется.Однако скрытое свойство предметов не меняется.Я пытался вызвать [self.view setNeedsDisplay];но это ничего не делает.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 февраля 2011

При инициализации контроллера представления из пера с использованием -initWithNibName:bundle: фактическое представление и его подпредставления не разархивируются до тех пор, пока в первый раз не будет получен доступ к свойству view контроллера представления, согласно документации:

Указанный вами файл пера не загружается сразу. Он загружается при первом обращении к представлению контроллера представления. Если вы хотите выполнить дополнительную инициализацию после загрузки nib-файла, переопределите метод viewDidLoad и выполните там свои задачи.

Попробуйте позвонить [mainMenu view] сразу после инициализации с пера. Это увлажнит иерархию представления от кончика.

Однако, я думаю, я не понимаю, почему вы разархивируете контроллер представления из пера и вызываете один из его методов, который влияет на пользовательский интерфейс (т. Е. Скрывает или показывает кнопки), не передавая этот контроллер представления в контроллер навигации или представляя это модально. -changeSong: - это метод для MainMenuController, поэтому простой вызов его сразу после инициализации MainMenuController не повлияет на кнопки, которыми он управляет.

(Не имеет отношения: вы устанавливаете mainMenu на nil перед его освобождением, что фактически означает, что mainMenu никогда не может быть освобожден. Сначала позвоните -release, а затем, по желанию, установите nil.)

0 голосов
/ 01 февраля 2011

Похоже, что MainMenuController не завершил инициализацию к тому времени, когда вы вызываете -changeSong, поэтому все в MainMenuController равно nil.

Чтобы решить эту проблему, либо отложите ваш вызов -changeSong, используя

[mainMenu performSelector:@selector(changeSong:) withObject:[songs objectAtIndex:indexPath.row] afterDelay:0.01];

или сделайте ваше табличное представление делегатом MainMenuController, и когда MainMenuController завершит загрузку из пера (используя - (void) awakeFromNib в MainMenuController), вызовите метод делегата для изменения песни.

Поскольку в обоих случаях вы задерживаете вызов, вам нужно быть осторожным, чтобы не отпустить контроллер представления перед тем, как сделать это, поэтому вам придется немного изменить этот код.

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