0

これは私の最初の質問であり、プログラミング分野では非常に新しいです。タブ バー コントローラーがあり、FVC (1 番目のビュー コントローラー) から SVC (2 番目のビュー コントローラー) にデータを転送したい。FVC では、配列 (VCArray) 内のタブ バー コントローラーに含まれるコントローラーを取得し、その配列の 2 番目のオブジェクトを SVC のインスタンスに割り当て、FVC の適切なデータを使用して SVC のプロパティを設定しますが、それらのプロパティは SVC では nil と表示されます。

さらに興味深いのは、VCArray の 2 番目のオブジェクトとして割り当てられた SVC インスタンスを [isOFKindClass SVC] と [isOFKindClass FVC] の両方でチェックすると、両方が実現することです。オブジェクトは 2 つのクラスを持つことができますか? [isOfKIndClass NSArray] をチェックすると false になります。これは、実装に問題がないことを意味します。

下手な英語でごめんなさい..:p

4

1 に答える 1

0

パート 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 に追加して、何が起こるか見てみましょう。

于 2012-08-28T12:11:19.423 に答える