2012-11-26 41 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

相关问题