1

私は現在、メソッド内NSMutableArrayクラス Amを構築しています。ViewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Question Array Setup and Alloc
    stratToolsDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:countButton,@"count",camerButton,@"camera",videoButton,@"video",textButton,@"text",probeButton,@"probe", nil];
    stratTools = [[NSMutableArray alloc] initWithObjects:@"Tools",stratToolsDict, nil];
    stratObjectsDict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:stratTools,@"Strat1",stratTools,@"Strat2",stratTools,@"Strat3",stratTools,@"Strat4", nil];
    stratObjects = [[NSMutableArray alloc]initWithObjects:@"Strategies:",stratObjectsDict,nil];
    QuestionDict = [[NSMutableDictionary alloc]initWithObjectsAndKeys:stratObjects,@"Question 1?",stratObjects,@"Question 2?",stratObjects,@"Question 3?",stratObjects,@"Question 4?",stratObjects,@"Question 5?", nil];


    //add strategys to questions
    QuestionsList = [[NSMutableArray alloc]init];
    for (int i = 0; i < 1; i++) {
        [QuestionsList addObject:QuestionDict];
    }
    NSLog(@"Object: %@",QuestionsList);

このメソッドの最後に、初期化されている QuestionsList が表示されるので、これArrayClass Bに送信する必要があります。

そこで、 andメソッド を使用してsettersandを配置します。クラスAhgetters@property@Synthesize

@property (retain, nonatomic) NSMutableDictionary *stratToolsDict;
@property (retain, nonatomic) NSMutableArray *stratTools;
@property (retain, nonatomic) NSMutableArray *stratObjects;
@property (retain, nonatomic) NSMutableDictionary *QuestionDict;
@property (retain, nonatomic) NSMutableArray *QuestionsList;

クラスアム

@synthesize QuestionDict;
@synthesize stratToolsDict;
@synthesize stratObjects;
@synthesize stratTools;
@synthesize QuestionsList;

クラス Bからこの変数を呼び出して、別の に代入できるようにするため、プロパティ メソッドを使用しますNSMutableArray

次に、クラス A@propertyのand@classクラス Bhに追加し、@interface で宣言します。NSMutableArray

#import "Class A.h"

    @class Class A;

    @interface Class B : UITableViewController<UITableViewDataSource, UITableViewDelegate>{
        NSMutableArray *QuestionList;
        Class A *arrayQuestions;
      }

    @property Class A *arrayQuestions;

NSMutableArray次に、クラス Bm のクラス A から呼び出します

-(id)initWithStyle:(UITableViewStyle)style
{
    if ([super initWithStyle:style] != nil) {

        //Make array
        arrayQuestions = [[Class A alloc]init];
        QuestionList = arrayQuestions.QuestionsList;

この直後にログを記録しNSMutableArrayて値を表示し、値がそこにあることを確認して、 を返しますNIL

//Log test
NSLog(@"QuestionList init method: %@",QuestionList);

クラス Bに関する情報- クラス Bクラス AUIPopOverController用です。クラス Bには、クラス A の結果を入力する必要がある a を保持するビューが 1 つあります。UITableView NSMutableArray

なぜNsMutableArray戻ってくるのNILですか?最終的には、それを理解するための助けも必要ですが、本当に混乱しているようです. 助けていただければ幸いです!!

4

1 に答える 1

1

最初の質問に答えるには、新しい XIB/ストーリーボード フレームがメモリの別の部分に既に表示されているにもかかわらず、クラス B の非表示バージョンをインスタンス化しているため、「突然」NIL プロパティがあります。

ストーリーボードを使用している場合はprepareForSegue、@HotLicks によって呼び出されたメソッドを利用することをお勧めします。個人的には、View Controller間でデータを前後に渡すためのこの回答が気に入っています。

ストーリーボードを使用していない場合は、新しい XIB を手動でプッシュして、オブジェクト指向に適した方法で A から B にデータを取得する必要があります。

シングルトン インスタンスは確かに問題を処理しますが、オブジェクト指向の純粋主義者の観点からは眉をひそめます。dispatch_onceこのルートをたどる場合は、View Controller が有用なデータを誤って再インスタンス化する可能性があることを確認する必要があります。

他にもいくつかの方法がありますが、それはボールを転がすのに役立つはずです. 幸運を。

于 2013-07-01T02:23:49.323 に答える