简体   繁体   中英

UIButton doesn't update

I'm trying to change the hidden property of a button and this is done in a method (View one):

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

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

This method is called from another view:

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

I know that the changeSong method is being called correctly because the music changes. However, the hidden property of the items don't change. I've tried calling [self.view setNeedsDisplay]; but this doesn't do anything.

Thanks

It looks like the MainMenuController hasn't finished initializing by the time you call -changeSong, which is why everything in MainMenuController is nil.

To solve this, either delay your call to -changeSong by using

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

or make your tableview the MainMenuController's delegate, and when MainMenuController is finished loading from the nib (using - (void)awakeFromNib in MainMenuController), call the delegate's method to change the song.

Since you're delaying the call in both cases, you'll have to be careful not to release the view controller before you do, so you'll have to change that code a little.

When initializing a view controller from a nib using -initWithNibName:bundle: , the actual view and its subviews aren't unarchived until the first time the view controller's view property is accessed, per the documentation:

The nib file you specify is not loaded right away. It is loaded the first time the view controller's view is accessed. If you want to perform additional initialization after the nib file is loaded, override the viewDidLoad method and perform your tasks there.

Try calling [mainMenu view] right after you initialize it from the nib. That will hydrate the view hierarchy from the nib.

However, I guess I don't understand why you're unarchiving a view controller from a nib and calling one of its methods that affects the UI (ie, hiding or revealing buttons) without pushing that view controller to a navigation controller or presenting it modally. -changeSong: is a method on MainMenuController , so simply calling it right after you initialize MainMenuController won't have any effect on the buttons that it manages.

(Unrelated: You're setting mainMenu to nil before releasing it, which effectively means mainMenu can never be released. Call -release first, then, optionally, set it to nil .)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM