5

私はiOS開発の初心者です。このコードを使用してRESTWebサービスに接続し、Json形式でデータをフェッチします。

    NSString *url=@"URL_Address";

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];

    NSURLResponse *resp = nil;
    NSError *err = nil;

    NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &err];

//    NSString * theString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 
//    NSLog(@"response: %@", theString);

    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: response options: NSJSONReadingMutableContainers error: &err];

    if (!jsonArray) {
        NSLog(@"Error parsing JSON: %@", err);
    } else {
        for(NSDictionary *item in jsonArray) {
            NSLog(@" %@", item);
            NSLog(@"---------------------------------");
        }
    }

今、私はそれらを経由して分離したいと思いますobjectForKey。私はループ内でこのコードを使用しました:

NSString *name = [item objectForKey:@"name"];

それは動作しません。このエラーが発生しました:

2012-07-31 12:48:38.426 LearningAFNetworking[390:f803] -[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x6844460
2012-07-31 12:48:38.428 LearningAFNetworking[390:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x6844460'
*** First throw call stack:
(0x13c8022 0x1559cd6 0x13c9cbd 0x132eed0 0x132ecb2 0x2f40 0x2bf8 0xd9a1e 0x38401 0x38670 0x38836 0x3f72a 0x290b 0x10386 0x11274 0x20183 0x20c38 0x14634 0x12b2ef5 0x139c195 0x1300ff2 0x12ff8da 0x12fed84 0x12fec9b 0x10c65 0x12626 0x254d 0x24b5 0x1)
terminate called throwing an exception(lldb)

手伝って頂けますか?

4

5 に答える 5

2

配列の0アイテムにアクセスする必要があります。item

NSArray *mainArray = [item objectAtIndex:0];
(NSDictionary *obj in mainArray) {
     NSString *name = [obj objectForKey:@"name"];
}

このエラーが発生した場合:-[__NSArrayM objectForKey:]、アクセスしようとしているオブジェクトが辞書ではないことを認識する必要があります。これは配列(__NSArrayM)であるため、最初に0インデックスにアクセスしてから、辞書の探索を開始する必要があります。

Ray Wenderlichによる、クラッシュに関するすべてを説明するこの素晴らしいチュートリアルをご覧ください

于 2012-07-31T11:06:05.573 に答える
2

アルベルトが言ったように、あなたはアイテムがNSDictionary実際にはしばらくの間、NSArray複数の辞書を含んでいると仮定しました。valueForKeyPathこれで、ドリルダウンパーツについて、以下に示すように使用できます。したがって、forループは次のようになります。

NSArray *items = [jsonArray objectAtIndex:0];

for (NSDictionary *item in items){
    NSString *name = [item valueForKey:@"name"];
    // You can also get nested properties like this
    NSString *projectName = [item valueForKeyPath:@"project.name"]; 
} 

たとえば、すべての「name」値を取得したい場合はvalueForKey、items配列で使用できます。これによりvalueForKey、各辞書が自動的に呼び出されます。例:

NSArray *items = [jsonArray objectAtIndex:0];
NSArray *names = [items valueForkey:@"name"];
于 2012-07-31T11:38:17.307 に答える
0

objectForKeyエラーとコードのログ出力から、でセレクターを実行しようとしているように見えますNSArray。に変更NSString *name = [item objectForKey:@"name"];してみてくださいNSString *name = [[item objectAtIndex: 0]objectForKey:@"name"];

于 2012-07-31T11:06:52.570 に答える
0

このコードが、辞書型の最初のオブジェクトをから取得するのに役立ちますか?NSArray

[[jsonArray objectAtIndex:0]objectForKey:@"object-key"];
于 2013-04-04T14:41:34.520 に答える
0
-(void)clientServerCommunication
{
    NSURL *url = [NSURL URLWithString:@"http://182.72.122.106/iphonetest/getTheData.php"];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:req delegate:self];
    if (connection)
    {
        webData = [[NSMutableData alloc]init];
    }
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [webData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [webData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:webData options:0 error:nil];

    /*Third party API
     NSString *respStr = [[NSString alloc]initWithData:webData encoding:NSUTF8StringEncoding];
     SBJsonParser *objSBJson = [[SBJsonParser alloc]init];
     NSDictionary *responseDict = [objSBJson objectWithString:respStr]; */
    resultArray = [[NSArray alloc]initWithArray:[responseDict valueForKey:@"result"]];
    NSLog(@"resultArray: %@",resultArray);
    [self.tableView reloadData];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    custcell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];



    if(custcell==nil)
    {

        custcell=[[[NSBundle mainBundle]loadNibNamed:@"custumCell" owner:self options:nil]objectAtIndex:0];

    }


    custcell.persnName.text=[[arr objectAtIndex:indexPath.row]valueForKey:@"Name"];
    //else if (objsegment.selectedSegmentIndex==1)
    //{
    custcell.persnAge.text=[[arr objectAtIndex:indexPath.row]valueForKey:@"Age"];

    [sortcontrol addTarget:self action:@selector(SegmentbtnCLK:) forControlEvents:UIControlEventValueChanged];

    //objsegment.selectedSegmentIndex=0;
    // }

    return custcell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
     //Create the next view controller.
    detailViewController *detailViewController1 = [[detailViewController alloc]initWithNibName:@"detailViewController" bundle:nil];

 //detailViewController *detailViewController = [[detailViewController alloc] initWithNibName:@"detailViewController" bundle:nil];

 // Pass the selected object to the new view controller.

 // Push the view controller.
 detailViewController1.nextDict = [[NSDictionary alloc]initWithDictionary:[resultArray objectAtIndex:indexPath.row]];
 [self.navigationController pushViewController:detailViewController1 animated:YES];

    // Pass the selected object to the new view controller.

    // Push the view controller.
  //  [self.navigationController pushViewController:detailViewController animated:YES];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    empName.text=[nextDict valueForKey:@"name"];
    deptlbl.text=[nextDict valueForKey:@"department"];
    designationLbl.text=[nextDict valueForKey:@"designation"];
    idLbl.text=[nextDict valueForKey:@"id"];
    salaryLbl.text=[nextDict valueForKey:@"salary"];
    NSString *ImageURL = [nextDict valueForKey:@"image"];
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
    image.image = [UIImage imageWithData:imageData];
}
于 2015-02-21T02:21:37.530 に答える