0

私は最初の iOS アプリケーション、つまり Recipe オブジェクトの配列を格納するクックブックに取り組んでいます。配列は、ヘッダー ファイルで次のように宣言されます。

@property (nonatomic, strong) NSArray *recipeArray;

viewDidLoad メソッドでは、次のように XML ファイルからのレシピを配列に入力します。

self.recipeArray = [[NSArray alloc]initWithArray:arrayFromXML];

viewDidLoad メソッド内で、そのコード行の後、配列の内容に正常にアクセスできます。

問題は、prepareForSegue メソッドで配列にアクセスしたいときに、配列が空のように見えることです。prepareForSegue メソッドの最初に、テスト出力ステートメントを挿入しました。

NSLog(@"Name called from segue: %@", [self.recipeArray[0] name]);

そして、「セグエから呼び出された名前: (null)

なぜこれが起こるのですか?配列の内容を取得するにはどうすればよいですか?また、viewDidLoad メソッドの実行が終了した後にそれらが保存されないのはなぜですか?

4

2 に答える 2

0

非常によくある初心者の間違いは、オブジェクト (通常はビュー コントローラー) のインスタンスを複数持つことです。これは、ビュー コントローラーをプログラムでインスタンス化するが、コントローラーが .xib またはストーリーボード ファイルでも指定されている場合に発生する可能性があります。たとえば、ストーリーボードの 2 つのビュー コントローラー間にセグエを接続しているが、次のようなことも行っているとします。

MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
vc.dataFileName = @"TheDataFile.txt";

その場合、コントローラーの複数のコピーが問題になる可能性が非常に高くなります。上記のようにインスタンス化してデータ ファイルを提供するものと、ユーザーがボタンをタップするかセグエをアクティブにしたときにストーリーボードが作成するものがあります。

メソッドにブレークポイントを設定して、ヒットするたびに の-viewDidLoad値 (この場合はビュー コントローラーのアドレス) が同じかどうかを確認してください。self

問題の原因がビュー コントローラーの複数のコピーにある場合、ビュー コントローラーをインスタンス化しない場合、ビュー コントローラーをどのようにセットアップすればよいのか疑問に思うでしょう。もちろん、答えはまさにそれが目的だということ-prepareForSegue:です。ここで、新しいView Controllerにデータを取得するファイルを指定したり、View Controllerがジョブを実行できるように設定したりできます。

于 2013-06-20T16:31:00.833 に答える
-1

このように NSArray の変更可能なコピーを作成する必要があると思います

NSArray *array = [[NSArray alloc]initWithArray:arrayFromXML];

self.recipeArray = [array mutableCopy];

次に、このレシピ配列を prepareForSegue メソッドで使用してみてください。viewDidLoad のように配列の内容が得られると思います。

幸運を!!!

于 2013-06-20T16:03:53.713 に答える