0

問題を解決するものを探していましたが、有用なものは見つかりませんでした。いくつかのコード: ClassA.h

#import "ClassB.h"

@interface ClassA : UIViewController
{
   ClassB *clsB;
}

@property (retain, nonatomic) IBOutlet UILabel  *label;
@property (retain, nonatomic) ClassB *clsB;

ClassA.m

@implamentation ClassA
@synthesize label, clsB;

- (void)viewDidLoad
{
   ...
   clsB = [[ClassB alloc] init];
   label.text = [[NSString stringWithFormat:@"%f", clsB.var];
   ...
}

問題は、var変更されていることです (NSLog を使用した ClassB 実装でこれを確認します) が、これらの変更はlabel.text.

私もすでにインポートしようとしましClassAClassBが、これも機能しませんでした(インポートエラー)。通知センターについて聞いたことはありますが、使用したことはありません。

それで、それを行う別の方法はありますか?ありがとう

4

2 に答える 2

1

デリゲートを使用するだけです。クラス B で、クラス A にコールバックを送信できるようにプロトコルを宣言します。

@protocol ClassBProtocol
-(void)classB:(ClassB*)b valueChanged:(float)value;
@end

また、デリゲートを持つクラス B のプロパティを宣言します。

@property (nonatomic, assign) id<ClassBProtocol>delegate;

.m でそのデリゲートを合成することを忘れないでください

次に、クラス B 内で、値が変更されるたびにメソッドを呼び出します。

-(void)methodThatChangesValue {
    //here the value will be set
    if( self.delegate != nil ) [self.delegate classB:self valueChanged:value];
}

クラス A で、クラス B を割り当て/初期化するときに、デリゲートをクラス A に設定します。クラス A がクラス B プロトコルに準拠していることを確認します。

@implementation ClassA () <ClassBProtocol>
@end
...
-(void)viewDidLoad: {
    self.classB = [[ClassB alloc] init];
    self.classB.delegate = self;
}

B のデリゲート メソッドを実装するだけです。

-(void)classB:(ClassB*)b valueChanged:(float)value {
    self.label.text = [NSString stringWithFormat:@"%f", value];
}

基本的に何が起こるかというと、クラス A がクラス B を所有しています。保持サイクルとメモリ リークが発生するため、クラス B にクラス A への強い参照を持たせたくありません。代わりに、クラス B のデリゲートを宣言します。これにより、それを所有するクラスへの弱い参照を持つことができます。したがって、ここではクラス A がクラス B のデリゲートになります。

このため、B 内の値が変更されるたびに、クラス A に実装されているプロトコル メソッドを呼び出すことができます。これは、クラス B のデリゲートであり、デリゲート メソッドを実装する必要があるためです。このメカニズムを通じて、値を前後に渡すことができます:)

于 2012-07-13T18:28:48.557 に答える
1

次のように前方宣言することで、インポート エラーを回避できますClassB

@class ClassB; 

インターフェイスの上にClassAインポートせずClassB.hClassA.h代わりにClassA.m

前方宣言で十分な理由は、コンパイラがその時点で知る必要があるのClassBは、実際にはどこかで定義したものだけだからです。その定義を見つけて接続するのはリンカー次第です。その理由は、単に実装に存在する以上のことを知る必要があるからです#import "ClassB.h"。この場合、という名前のプロパティがあることを知る必要がありますClassA.mClassBClassBvar

于 2012-07-13T18:33:21.553 に答える