2012-11-26 38 views
0

在CLASSA我有:爲什麼nsstring在另一個類中使用時不見了?

classB *classBI=[[classB alloc]init]; 
bits=[classBI data]; //bits has a property here in classA,it gets data from B/ 
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(38.f, 20.f, 244.f, 43.f)]; 
label.text = bits; 

在CLASSB我有:

@property (nonatomic,retain) NSString *data; //in .h file 
    [email protected]"no data"; //at the init method of classB . 

    //then after a while when something is happen in classB , data is changed to : 
    data=[NSString stringWithFormat:@"data:%f,%f,%f,%f,%f,%f", 
     dataBits[0],dataBits[1],dataBits[2],dataBits[3],dataBits[4],dataBits[5] ]; 

ClassA的是主場景(cocos2d的,但它並不重要)。在開始的時候,我可以在標籤中看到classA中的「無數據」這個詞,但是當classB中的數據發生變化時,我無法看到屏幕上標籤的變化。它留下的字:「沒有數據」 這是爲什麼? 爲什麼我丟失了數據? 如果我在classB中的NSLOG數據,在它改變之後,我可以看到它不爲空,並且它具有新的值。 B的實例在A中出現了這個字符串,這是錯誤的。

+1

你必須從某個地方更新標籤!設置一次不會自動將它「綁定」到b類的值。你在哪裏更新標籤? – Mario

+0

我不..但它的指針 - 它沒有得到值「永遠」? – Curnelious

+1

不,它指向**字符串**,表示「無數據」。當您將數據設置爲新字符串時,位仍舊指向舊字符串。 – lnafziger

回答

2

當您將標籤的文本設置爲由bits指向的字符串時,它將存儲對字符串的的引用。後來,當您更改data時,它正在創建一個data指向的新字符串,但bits和標籤都仍具有正在查看原始字符串的原始指針。要更新他們時,data改變:

有采取在這種情況下幾種方法,但一個最簡單的將是觀察的classBIdata屬性更改,並更新兩個bits和標籤時,它變化:

[classBI addObserver:self 
      forKeyPath:@"data" 
      options:NSKeyValueObservingOptionNew 
      context:NULL]; 

之後,當數據的變化,這種方法被稱爲:

// Note that you will need to get a reference to 'label' in order for this to work: 
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { 
    if ([keyPath isEqual:@"data"]) { 
     bits = [change objectForKey:NSKeyValueChangeNewKey]; 
     label.text = bits; 
    } 
} 
+0

已刪除........ – Mario

+0

很好的答案非常感謝!但我不明白,如果位指向數據,那麼從現在起數據將指向哪裏,位也將指向,這是指針沒有的事情? – Curnelious

+0

好吧,它不工作.. – Curnelious

相關問題