1

これが私のコードです(リモートサーバー上のソースから複数のJSONファイルを解析する必要があります)。UITableViewに各解析のSINGLE値を入力する必要があります。

単一のJSONソース(単純)、h ** p://WWW.REMOTESERVERWITHJSONSOURCE.NET/A1:

{
  "id": 0001,
  "main": {
    "main1A": 100,
  },
  "main2": {
    "main2A": 200,
  },
  "url": "http...",
}

配列を割り当てて初期化します。

    - (void)viewDidLoad {

        // other stuff

        arrayA = [[NSMutableArray alloc] initWithObjects:@"A1", @"A2", nil]; //each object A1, A2...An is the single JSON source I need to parse
        arrayB = [[NSMutableArray alloc] initWithObjects:@"B1", @"B2", nil];
    }

解析方法:

- (void)LoadParse {

         main = [[NSMutableArray alloc] init];
         main2 = [[NSMutableArray alloc] init];

        for (int i=0; i < [arrayA count]; i++) {

            NSURL *url = [NSURL URLWithString:
                          [NSString stringWithFormat:
                           @"http://WWW.REMOTESERVERWITHJSONSOURCE.NET/%@",[arrayA objectAtIndex:i]]];

            NSURLRequest *request = [NSURLRequest requestWithURL:url];

            AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

            NSMutableDictionary *arrayMain = [JSON valueForKey:@"main"];
            [main addObject:[arrayMain objectForKey:@"main1A"]];
            NSMutableDictionary *arrayMain2 = [JSON valueForKey:@"main2"];
            [main2 addObject:[arrayMain2 objectForKey:@"main2A"]];

            [table reloadData];
            [table scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

            }

            failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON){

            }];

            [operation start];

            }
    }

UITableViewメソッド:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return [arrayA count];
}

//他のメソッド

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:
                UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
    }

            cell.textLabel.font = [UIFont systemFontOfSize:12];
            cell.detailTextLabel.font = [UIFont systemFontOfSize:11];

            cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@",[main objectAtIndex:indexPath.row],[main2 objectAtIndex:indexPath.row]]; // here I get error 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

        cell.textLabel.backgroundColor = [UIColor clearColor];
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
        return cell;
}

エラー:arrayAで1つのオブジェクトのみを割り当てて初期化すると、問題ありません。UITableViewに1つの行が入力され、main1とmain2の値が取得されます。この例のように、arrayAに複数のオブジェクトを割り当てて初期化すると、アプリがエラー信号SIGABRT:'NSRangeException'、理由:' * -[__ NSArrayM objectAtIndex:]:インデックス1を超えてクラッシュします[0 .. 0] ' ... なにが問題ですか?トラブルを見つけるのを手伝ってください、ありがとう!

4

1 に答える 1

1

[添加]

// Implement this for your numberOfRowsInSection
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    unsigned int mCount  = [main  count];
    unsigned int m2Count = [main2 count];

    return ( (mCount > m2Count) ? mCount : m2Count );
}

[追加2]

// Implement something like this within your cellForRowAtIndexPath routine
bool mainExist  = ( (indexPath.row < [main count])  ? YES : NO );
bool main2Exist = ( (indexPath.row < [main2 count]) ? YES : NO );

if(YES == mainExist && YES == main2Exist){
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@",[main objectAtIndex:indexPath.row],[main2 objectAtIndex:indexPath.row]];
}else if(YES == main2Exist){
    cell.textLabel.text = [NSString stringWithFormat:@"___ - %@",[main2 objectAtIndex:indexPath.row]];
}else{ // YES == mainExist
    cell.textLabel.text = [NSString stringWithFormat:@"%@ - ___",[main objectAtIndex:indexPath.row]];
}

(コードから)arrayAを使用してセルカウントルーチンを駆動しているように見えますが、mainとmain2を使用してデータを入力しています。mainおよび/またはmain2を使用して、セルカウントルーチンの出力も生成する必要があります。

起こっているように見えるのは、そのように初期化するときにarrayAに2つの要素があるということですが、データのために、mainとmain2は1で満たされるだけです。したがって、セルカウントルーチンが2を返すと、セルジェネレータルーチンはmainを探します。インデックスが0になる場合は、main2インデックス1。

これは私があなたのコードから直接見たものです。あなたのコードまたはデータが実際に異なる場合は、私に知らせてください。

于 2013-01-29T16:44:21.307 に答える