0

classA で私は持っています:

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
    data=@"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 でも構いません)。最初は、クラスAのラベルに「データなし」という言葉が実際に表示されていますが、クラスBでデータが変更されると、画面上のラベルにその変更が表示されません。「データなし」という言葉にとどまります。なぜですか?なぜ私はデータを失ったのですか?classB の NSLOG データが変更された直後に、null ではないことがわかり、新しい値が含まれていることがわかります。この文字列を取得する A の B のインスタンスに何か問題があります。

4

1 に答える 1

2

が指す文字列にラベルのテキストを設定すると、その文字列bitsへの参照が格納されます。後で を変更すると、を指す新しい文字列が作成されますが、ラベルには元の文字列を見ている元のポインタがまだあります。が変更されるたびにそれらを更新したい:datadatabitsdata

この状況で取るべきアプローチはいくつかありますが、最も簡単な方法の 1 つは、 for changes のdataプロパティを観察し、変更されるたびにclassBI両方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;
    }
}
于 2012-11-26T23:10:20.327 に答える