0

iOS の新機能。AFNetworking を使用して JSON データをダウンロードし、そのデータを Dictionary オブジェクトに入れています。これは、次のコードで行われます。

-(void)locationRequest
{
NSURL *url = [NSURL URLWithString:@"http://sitespec/php/getlocations.php"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];
//AFNetworking asynchronous url request
AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse         *response, id responseObject)
                                     {

                                         self.locationsFromJSON = (NSDictionary *)responseObject;

                                         NSLog(@"JSON RESULT %@", responseObject);
                                         NSLog(@"JSON DICTIONARY %@", _locationsFromJSON);
                                         [self.tableView reloadData];
                                     }
                                     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id responseObject)
                                     {
                                         NSLog(@"Request Failed: %@, %@", error, error.userInfo);
                                     }];

[operation start];

}

以下の NSLOG 呼び出しの outpur に見られるように、データを取得して Dictionary 配列にデータを入力しています。

2013-05-12 12:44:08.851 sitespec[2024:c07] JSON RESULT (
    {
    city = "Rocky Mount";
    id = 1;
    name = "Rocky Mount";
    phone = "(252) 451-1811";
    state = NC;
    "street_address" = "620 Health Drive";
    zip = 27804;
},
    {
    city = "Elizabeth City";
    id = 2;
    name = "Elizabeth City";
    phone = "(252) 335-4355";
    state = NC;
    "street_address" = "109 Corporate Drive";
    zip = 27906;
}
)
2013-05-12 12:44:08.852 sitespec[2024:c07] JSON DICTIONARY (
    {
    city = "Rocky Mount";
    id = 1;
    name = "Rocky Mount";
    phone = "(252) 451-1811";
    state = NC;
    "street_address" = "620 Health Drive";
    zip = 27804;
},
    {
    city = "Elizabeth City";
    id = 2;
    name = "Elizabeth City";
    phone = "(252) 335-4355";
    state = NC;
    "street_address" = "109 Corporate Drive";
    zip = 27906;
}
)

しかし、ここで私は迷子になります.....

私のDictionaryオブジェクトでこのデータにアクセスするにはどうすればよいですか

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法?

何かのようなもの:

 static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

cell.textLabel.text = [self.locationsFromJSON objectForKey:@"name"]; 

???

これは機能せず、SIGBART エラーが発生します。データを読み込んでテーブル ビューに入力する方法がわかりません。

どうすればいいですか?どんな助けでも大歓迎です.....

4

3 に答える 3

1

私はこれをよく目にしますが、人々が辞書からデータを抽出し、テーブル ビューに辞書の内容を入力するのに苦労している理由がわかりません。JSON 応答用のモデル クラスを作成せず、その後、必要に応じてモデルを配列に追加する理由がわかりません。

したがって、Tommyさん、たとえば、Address という名前のクラス モデルを作成し、すべての JSON 属性をプロパティとしてモデル クラスに追加することを強くお勧めします。JSON を解析するときに、配列に追加する Address クラス インスタンスを作成します。その後、テーブルビュークラスには、アドレスの配列と次のものが含まれます。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionあなたは戻ってきますyourAddressesArray.count

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    Address *address = [yourAddressesArray objectAtIndex:indexPath.row];    //assign your address properties to labels etc 

}

モデルクラスがあると簡単です;)

解析のために編集

あなたの質問で私が見たものから、あなたは辞書の配列を持っています。したがって、次のようなことをお勧めします。

Address クラスで、josn を使用して imit メソッドを作成します。

-(id)initAddressWithJSON:(id)JSON {
    slef = [super init];
    if(self) {
      self.city = [JSON objectForKey:@"city"];
      // set all the properties here
    }
    return self;
}

呼び出された json 応答を受け取ったら、「jsonResopnse」としましょう。次のようにする必要があります。

-(NSArray*)myAddressesFromJSON:(id)JSON {

   //you should add a validation here for JSON  (not null not empty)
   NSMutableArray *addresses = [[NSMutableArray alloc] init];
   Address *address;
   for(NSDictionary *addressDict in JSON) {
       address = [[Address alloc] initWithJSON:addressDict];
       [addresses addObject:address]; 
   }
   return addresses;
}

私は自分の頭からコードを書き、Xcode を使用していないことに注意してください :) いくつかのビルド エラー (スペルミス) がある可能性がありますが、理解していただければ幸いです。また、JSONKit を使用していると思います。

于 2013-05-12T17:41:51.073 に答える
0

ご覧のとおり、JSON リクエストとUITableViewを同じクラスで使用しています。メソッドにブレークポイントを設定し、cellForRowAtIndexPath既にデータがあるかどうかを確認します。いいえの場合:

あなたの辞書がすでに満たされている場合は、メソッドで- (NSInteger)numberOfRowsInSection:(NSInteger)section尋ねるか、すでに入っています。numberOfSectionsそれ以外の場合は 0 を返します。

そして、JSON データを受け取るメソッドで、[tableView reloadData];

それが問題でない場合は、SIGBART エラーが発生した場所を教えてください ;)

于 2013-05-12T17:41:17.357 に答える
-1

すばらしいフィードバックをくれた danypata に感謝します。これを実現するために、私は少し異なるルートをとりました。私が考えさせられたのは、danypata のコメント「JSON 応答に辞書の配列があるように見える」でした.... AFNetworking ブロックでは、JSON 応答を取得し、JSON オブジェクトをプロパティとして定義された配列に割り当てます。現在の TableViewCONtroller。

-(void)locationRequest

{ NSURL *url = [NSURL URLWithString:@"myurl"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];
//AFNetworking asynchronous url request
AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id responseObject)
                                     {

                                         self.locationsFromJSON = responseObject;
                                         [self.tableView reloadData];
                                     }
                                     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id responseObject)
                                     {
                                         NSLog(@"Request Failed: %@, %@", error, error.userInfo);
                                     }];

[operation start];

}

また、JSON 応答の各値に対して Mutable Dictionary プロパティと NSString プロパティを宣言します。以下の TableVIewCell メソッドでは、index.row にあるディクショナリ オブジェクトを取得し、キーの値を読み取り、それらをプロトタイプ セル ラベル プロパティに割り当てます。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"locCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    
if (cell == nil) {

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  reuseIdentifier:CellIdentifier];

}


self.dictObj = [[NSMutableDictionary alloc] init];
self.dictObj = [_locationsFromJSON objectAtIndex:indexPath.row];
cell.textLabel.text =  [_dictObj valueForKey:@"city"];  
cell.detailTextLabel.text = [_dictObj valueForKey:@"phone"];     
return cell;
}

これはうまくいきました!明らかに「辞書オブジェクトの配列があるように見えます.....」と他の誰かが指摘しただけです。

于 2013-05-14T12:28:56.250 に答える