2011-02-01 65 views
0

我試圖改變一個按鈕的隱藏屬性,這是一個方法來完成(查看一個):的UIButton不更新

-(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];但是這並沒有做任何事情。

感謝

+0

如果你把一個斷點changeSong方法中的playButton.hidden行是playButton nil(0x0),還是具有實際值?如果它是零,你可能只是忽略了將UIButton連接到Interface Builder中的playButton ivar。 – 2011-02-01 17:13:30

+0

該值爲零,如下所示:http://d.pr/7rrU但它在「接口」構建器中已鏈接:http://d.pr/z2B – Denis 2011-02-01 17:42:08

回答

0

它看起來像MainMenuController還沒有完成由調用-changeSong的時間,這就是爲什麼一切MainMenuController是零初始化。

爲了解決這個問題,無論是使用

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

耽誤您到-changeSong來電或讓你的tableview的MainMenuController的委託,當MainMenuController從筆尖加載完成後(使用 - 在MainMenuController(無效)awakeFromNib ),請調用委託人的方法來更改歌曲。

由於您在這兩種情況下都推遲了調用,所以在做之前您必須小心不要釋放視圖控制器,因此您必須稍微更改該代碼。

+0

執行選擇器解決方案無法正常工作,因此我要當我明天起牀時嘗試使用委託方法。如果這不起作用,我會告訴你。 – Denis 2011-02-01 22:16:04

0

當使用-initWithNibName:bundle:初始化從筆尖視圖控制器,實際視圖和它的子視圖不是取消存檔在第一時間視圖控制器的view屬性被訪問,直到每文檔:

筆尖文件你指定的不是馬上加載。它在第一次訪問視圖控制器的視圖時加載。如果您想在加載nib文件後執行額外的初始化,請覆蓋viewDidLoad方法並在那裏執行任務。

嘗試在從筆尖初始化後立即致電[mainMenu view]。這將從nib保存視圖層次結構。

但是,我想我不明白爲什麼你從一個筆尖取消存檔視圖控制器並調用其中一個影響UI的方法(即隱藏或顯示按鈕),而無需將該視圖控制器推送到導航控制器或以模態方式呈現它。 -changeSong:MainMenuController上的方法,因此在初始化MainMenuController後簡單調用它就不會對其管理的按鈕產生任何影響。

(無關:釋放它,這實際上意味着mainMenu永遠不能被釋放之前你設定mainMenunil呼叫-release第一,然後任選,將其設置爲nil。)