パート 1 の答えは、別のクラスがアクセスできるように SVC でプロパティを公開する必要があり、FVC は svc のインターフェイス ファイル (.h) をインポートする必要があるということです。したがって、ほとんどの場合、これを行うには 2 つのことが必要になります。変更したいクラスを見つける方法と、そのクラスのインターフェースです。プロパティは次のようになります。
SVC.h:
@property (nonatomic, strong) NSString *title;
- (void)doSomething;
FVC:
#import "SVC.h"
SVC *svc = ...; // get a reference to it
svc.title = @"Howdie!";
[svc doSomething]; // tell the class to use the title you just set, for example
2 番目の質問に答えると、これらの「is..」メソッドには、isKindOfClass と isMemberOfClass の 2 種類があります。最初は、現在のオブジェクトが提供されたクラスのタイプ、または ANY スーパークラスであると言います。2 番目は、クラスが実際に正確なメンバーである場合にのみ渡されます。例えば:
NSMutableData *data;
[data isKindOfClass:[NSData class]] == YES
[data isKindOfClass:[NSMutableData class]] == YES
[data isMemeberOfClass:[NSData class]] == NO
[data isMemeberOfClass:[NSMutableData class]] == YES
編集:したがって、データは決して SVC になりません。これを試してみてください - プロパティは、ivar、getter、(通常は) setter を持つための単なるショートカットです。実際には、独自のセッターを提供できます。つまり、(上記の私の例を使用して) SVC のタイトルは、SVC によって設定されているにもかかわらず、常に nil であると言います。これが発生する理由は 3 つだけです。
FVCには別のオブジェクトへの参照がありますが、実際にはSVCと呼んでいるため、値が設定されると、SVCではなく別のクラスに設定されます
FVC が値を設定したとき、SVC は nil オブジェクトでした (ObjectiveC はメッセージを nil に適切に処理するため、コンソールにエラーは表示されません)。
SVC は、たとえば viewWillAppear で知らないうちに値を nil にリセットしました
したがって、これを見つける方法は、変数セッターをオーバーライドすることです (ここでも私の例を使用します)。
- (void)setTitle:(NSString *)val
{
title = val; // ARC way
NSLog(@"SVC - just set title to %@", title);
}
これを SVC に追加して、何が起こるか見てみましょう。