2016-10-24 6 views
2

私は、一連の質問とそのオプションと答えがjson構文解析によって取得されるアプリケーションを作成するコードを作成しています。私はviewDidLoadメソッドでこれをすべてやっています。json出力のクラスインスタンスに値を代入する

これまでのコードです。解析コードが正常に動作しています。 NSLog(@"%@", jsonData[@"data"]);コードの出力がコンソールでどのように見えるか

- (void)viewDidLoad { 
[super viewDidLoad]; 
question *quest = [[question alloc] init]; 
//Parsing code 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:@"http://***/****/fetch.php"]]; 
[request setHTTPMethod:@"POST"]; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
[[session dataTaskWithRequest:request completionHandler:^(NSData *data , NSURLResponse *response , NSError *error){ 
    NSError *err = nil; 
    id jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err]; 
    if (err) { 
     [self alertMessage:(@"%@", err)]; 
    } 
    else { 

//Unclear from here 


     NSLog(@"%@", jsonData[@"data"]); 
     allData = jsonData[@"data"]; 
     NSLog(@"%lu",(unsigned long)allData.count); 
     int count = allData.count; 
     int i = 0; 
     while (i < count){ 
      question *que; 
      NSString *q,*a,*o1,*o2,*o3,*o4; 
      a = [allData valueForKey:@"answer"]; 
      q = [allData valueForKey:@"question"]; 
      o1 = [allData valueForKey:@"option1"]; 
      o2 = [allData valueForKey:@"option2"]; 
      o3 = [allData valueForKey:@"option3"]; 
      o4 = [allData valueForKey:@"option4"]; 

      //NSLog(@"%@", [allData valueForKey:@"question"]); 
      [que setValue:q forKey:@"question"]; 
      [que setValue:a forKey:@"answer"]; 
      [que setValue:o1 forKey:@"option1"]; 
      [que setValue:o2 forKey:@"option2"]; 
      [que setValue:o3 forKey:@"option3"]; 
      [que setValue:o4 forKey:@"option4"]; 
      i++; 

      NSLog(@"%@",[que valueForKey:@"question"]); 
     } 

    } 
}] resume]; 

}

がここにあります。

{ 
     answer = sometext; 
     id = 7; 
     option1 = sometext; 
     option2 = sometext; 
     option3 = sometext; 
     option4 = sometext; 
     question = "sometext"; 
    },   
     { 
     answer = sometext; 
     id = 9; 
     option1 = sometext; 
     option2 = sometext; 
     option3 = sometext; 
     option4 = sometext; 
     question = "sometext"; 
    } 
) 

は、私の知る限り理解し、このJSONデータ辞書(?)

私がやっている次のステップは、私が作成しているされた「質問」クラスの配列です。私がしようとしているqueと呼ばれるquestionクラスの午前インスタンスを作成しようとしていviewDidLoad方法でwhileループで

#import "question.h" 
@implementation question {  
NSString *q; 
NSString *a; 
NSString *o1; 
NSString *o2; 
NSString *o3; 
NSString *o4;  
} 
@end 

:私はそれが正しいが、ここでそのためのコードだしなかった場合、私はわかりませんコードに示すように入力します。 しかし、NSLog(@"%@",[que valueForKey:@"question"]);という行は、コンソールにnullと表示されます。

私が使用している方法に何か問題があると確信しています。

第2の問題は、viewDidLoadの直後に宣言するquestと呼ばれるquestionという配列を作成していることです。しかし、私はボタンのクリックイベントのような他のコードブロックでそれを使用することはできません。

initialiser element is not a compile-time constant

は、私は、これはコードの理想的な方法ではないことを知っているが、私はここにまだ初心者だと、これらすべてを持つだけで混乱しています:私はviewDidLoadquestion *quest = [[question alloc] init];ラインを使用しようとする場合には、エラーが発生します新しい概念。私はSwiftで同じアプリを開発しましたが、Objective Cはあまりにも難しいと感じています。 ご協力いただければ幸いです。

答えて

1

はあなたが質問クラスのインスタンスを保存するNSMutableArrayのを作成する必要があり、すべての最初の欲しかったものを手に入れるために、あなたは

@interface MyClass() { 
    NSMutableArray * arrQuestion; 
} 

今、このようなグローバルな配列として宣言する必要がありますあなたは

@interface question : NSObject 
@property (nonatomic, strong) NSString *strQuestion; 
@property (nonatomic, strong) NSString * strAnswer; 
@property (nonatomic, strong) NSString * strOptionA; 
@property (nonatomic, strong) NSString * strOptionB; 
@property (nonatomic, strong) NSString * strOptionC; 
@property (nonatomic, strong) NSString * strOptionD; 
@end 
クラスとしてそれを作成しているようquestion.hに、あなたはこのようなすべての変数のための @propertyを宣言する必要があり、また、問題のクラスはNSObjectのから派生されます

は今whileループでは、あなたの質問クラスの新しいインスタンスを作成する必要があり、あなたがこの

question *quest = [arrQuestion objectAtIndex:0]; //For Example value at 0 index 
NSLog(@"Value of first question - %@", quest. strQuestion); 
+0

ありがとうございました!これはうまくいった。今私は間違っていることを知っている!助けてくれてありがとう! –

1

クエストは配列として宣言されていません。クラス定義内の配列を宣言します(.hファイル内)。例えば ​​- あなたが解析したデータにデータを追加しようとし始める前に、

NSMutableArray *questionsArray; 

(あなたは、ないviewDidLoadメソッドでも、独自のメソッドにパースを移動する必要があります)あなたがそれを初期化していることを確認してください。

questionsArray = [[NSMutableArray alloc] initWithCapacity:20]; 

キー/値のプロパティを使用できますが、次のようなものがあります。

que.answer = [allData valueForKey:@"question"]; 

はクリーナー(imo)です。質問が解析された後、これをあなたの配列に追加することができます。 、

[questionsArray addObject:que]; 
+0

のような値にアクセスすることができますarrQuestionから今この

arrQuestion = [NSMutableArray new]; while (i < count){ question *quest = [[question alloc] init]; quest.strQuestion = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"question"]; quest.strAnswer = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"answer"]; quest.strOptionA = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option1"]; quest.strOptionB = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option2"]; quest.strOptionC = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option3"]; quest.strOptionD = [[[jsonData objectForKey:@"data"]objectAtIndex:i] objectForKey:@"option4"]; i++; [arrQuestion addObject:quest]; } 

のようにそれに値を割り当てる必要がありますヒントをありがとう!私は解析セクションをそれ自身のメソッドに移しました。 –

関連する問題