2012-03-19 50 views
0

我有一個問題,我想設置UILabel或UItextView或另一個IBOUTLET對象的文本,但我只能在viewwillappear和viewdidload方法,如果我在代碼中的另一種方法中設置文本不會改變什麼,這裏是一個例子:UILabel,UITextView等..只能在ViewWillAppear和ViewDidLoad中工作,不要動態更改

我有一種方法,從另一個類檢索字符串,然後我想設置此字符串在我的uilabel :

- (void)setDetailItem:(id)newDetailItem 
{ 

if (detailItem != newDetailItem) { 
    NSLog(@"SetDetailItem"); 
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 
    detailString = [[FindStringClass alloc] init]; 
    // Update the view. 

    detailItem = [detailString searchStringFor:detailItem.name]; 

    if (detailItem) { 
     // 
     NSLog(@"setDetail: %@",detailItem.stringName); 
     [self configureView]; 
    } 

    } 
} 

    - (void)configureView { 

NSLog(@"configure view: %@",detailItem.stringName); 
mySerialTitle.text = detailItem.stringName; 
} 

的NSLog的工作,我可以看到我的字符串中的控制檯,但在視圖中的文本不換,而不是如果我在ViewWillApp設定一個簡單的文本耳朵或viewDidLoad方法的工作,所以與IBOOutlets的連接是正確的,就像這樣:

- (void)viewDidLoad 
{ 
mySerialTitle.text = @"CIAO"; 
[super viewDidLoad]; 
// Do any additional setup after loading the view from its nib. 
} 

這是調用函數,其中我所說的setDeatItem從另一種觀點認爲:

self.searchResultViewController.detailItem = [myArray objectAtIndex:[indexPath row]];  
    [self.navigationController pushViewController:self.searchResultViewController animated:YES]; 

有人能幫助我?

編輯: 這是的NSLog其中該方法被稱爲:

2012-03-19 12:51:02.617 TestApp[292:b603] SetDetailItem 
2012-03-19 12:51:06.161 TestApp[292:b603] setDetail: Chicken 
2012-03-19 12:51:06.162 TestApp[292:b603] configure view: Chicken 
2012-03-19 12:51:06.175 TestApp[292:b603] View DidLoad 

我調用從Tableviewcontroller的searchviewcontroller視圖我按下上的行,然後調用新的視圖,並通過該屬性。

+0

發佈更多的代碼...給你的第一個功能的整個代碼..當這被稱爲.. – Shubhank 2012-03-19 11:04:59

+0

我已編輯...但NSLog的工作,所以我不明白爲什麼不改變標籤中的文本...如果我這樣做:mySerialTitle.text = @「CIAO」;在配置視圖方法或setDetailItem方法中,不要更改文本...我要瘋了 – Piero 2012-03-19 11:21:27

+0

添加斷點並檢查配置視圖是否實際調用或不...您是否也可以告訴您何時調用第一個功能..給你從哪裏調用它的代碼..post該功能太.. – Shubhank 2012-03-19 11:29:54

回答

0

viewDidLoad在視圖加載到內存後調用。請參閱蘋果文檔中的viewDidLoad。在視圖加載到內存中並且在它出現之前,viewWillAppear被調用。

在加載視圖之前,您無法更改該視圖的屬性。因此,請檢查您的代碼路徑(甚至可能註銷這些方法以及viewDidLoad和viewWillAppear方法),然後查看是否在調用viewDidLoad之前設置了這些屬性(日誌輸出可以很容易地看到)。

從viewDidLoad中文檔:

視圖控制器加載其視圖 層級到存儲器後,此方法被調用。不管 視圖層次結構是從nib文件加載還是以編程方式在loadView方法中創建 ,都會調用此方法。通常,您可以重寫此方法,以對從nib文件加載的視圖執行附加初始化操作 。

您所添加的日誌語句清楚地表明您在加載之前操作視圖。正如你所看到的,setDetail在viewDidLoad之前被調用。

2012-03-19 12:51:02.617 TestApp[292:b603] SetDetailItem 
2012-03-19 12:51:06.161 TestApp[292:b603] setDetail: Chicken 
2012-03-19 12:51:06.162 TestApp[292:b603] configure view: Chicken 
2012-03-19 12:51:06.175 TestApp[292:b603] View DidLoad 

如果你想在你推送的視圖上設置數據,你有幾個選項。

  1. 調用setDetail但在setDetail中只設置iVar數據 - 不處理視圖。然後,在viewDidLoad/WillAppear中,讀取iVar數據並操作視圖。

  2. 使用委託有你推回撥到發射視圖的視圖。見What exactly does delegate do in xcode ios project?

+0

我知道何時調用viewdidload和viewwillappear,我的問題是我無法在我的代碼中設置我的uilabel的文本,並且只能在viewwillappear和viewdidload方法中使用 – Piero 2012-03-19 11:41:16

+0

「在我的代碼中」在調用viewDidLoad之前? – bryanmac 2012-03-19 11:42:42

+0

我已經寫了控制檯日誌,似乎它被稱爲第一個viewdidload,它存在的問題? – Piero 2012-03-19 11:57:18

0
- (void)setDetailItem:(id)newDetailItem 
{ 

if (detailItem != newDetailItem) { 
    NSLog(@"SetDetailItem"); 
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 
    detailString = [[FindStringClass alloc] init]; 
    // Update the view. 

    detailItem = [detailString searchStringFor:detailItem.name]; 

    if (detailItem) { 
     // 
     NSLog(@"setDetail: %@",detailItem.stringName); 
     [self configureView]; 
    } 

    } 
} 

上述功能,無論你在呼喚它form..i不知道..確保你叫它後

[self.navigationController pushViewController:self.searchResultViewController animated:YES]; 

,如果你在此之前叫它..然後你的看法沒有正確加載和設置文本標籤將無法正常工作..

相關問題