Josué H.
Josué H.

Reputation: 1191

Error when setting values from JSON on my UITableViewCell

I have a problem when set values on my UITableViewCell. I get this data from Web Service in JSON format, to do this created a class that contains all the data from JSON.

That is the Class.

Refunds.h

#import <Foundation/Foundation.h>

 @interface Refunds : NSObject

 -(id)initWithJSONData:(NSDictionary*)data;

 @property (assign) NSNumber *refunds_id;
 @property (assign) NSNumber *request_number;
 @property (strong) NSString *policy_code;
 @property (strong) NSString *company;

 @end

Refunds.m

#import "Refunds.h"

 @implementation Refunds 

 @synthesize refunds_id;
 @synthesize request_number;
 @synthesize policy_code;
 @synthesize company;
 -(id)initWithJSONData:(NSArray*)data{
 self = [super init];
 if(self){
    NSLog(@"initWithJSONData method called ");

    //NSString *u = [data valueForKey:@"policy_code"];
    //NSLog(@"%@",u);

    refunds_id =  [data valueForKey:@"id"];
    request_number = [data valueForKey:@"request_number"];
    policy_code = [data valueForKey:@"policy_code"];
    company = [data valueForKey:@"company"];
    }
    return self;
    }
    @end

In the ViewController where I use the UITableVIew I have this implementation

NSMutableArray refunds_view = [[NSMutableArray alloc] init];

for (NSDictionary *each_refunds in self.list) {
    Refunds *refunds = [[Refunds alloc] initWithJSONData:each_refunds];
    [refunds_view addObject:refunds];
}

In the method

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

I have this:

Refunds *current = [refunds_view objectAtIndex:indexPath.row];
cell.date_admission.text = [current company]; 

In the line cell.date_admission.text = [current company]; gives me the following error

-[__NSArrayI length]: unrecognized selector sent to instance 0x8bc4eb0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x8bc4eb0'

That is the JSON Format.

[
{
    "id": 1,
    "holder_rut": 12345678,
    "holder_name": "Otro Pedro",
    "rut": 12345678,
    "name": "Otro Pedro",
    "refunds_view": [
        {
            "id": 60,
            "request_number": 456789,
            "policy_code": "3500009001",
            "company": "Benefits",
            "beneficiary_id": 1,
            "concept": "Prueba More",
            "date": "2014-05-21",
            "amount": 20000,
            "deductible_amount": 0,
            "max_applied": 0,
            "yearly_balance": 97,
            "payment_amount": 14000,
            "payment_method": "Deposito",
            "bank": "Estado",
            "account_number": "1234567",
            "payment_date": "2014-06-20",
            "created_at": "2014-06-18 21:55:41"
        }
    ]
}

The data I need to show is that this refunds_view

View Controller Code

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

static NSString *simpleTableIdentifier = @"SimpleCell";

RowCell *cell = (RowCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {

    //inicilitacion cell custom
    cell = [[RowCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}


Refunds *current = [refunds_view objectAtIndex:indexPath.row];
NSLog(@"company %@",[current company]);
cell.date_admission.text = [current company];


return cell;
}

ViewDidLoad

 - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

//Geting data from JSON Refunds
SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init];
NSDictionary *dict = [NSDictionary
                      dictionaryWithObjects:[NSArray arrayWithObjects:rut_user, nil]
                      forKeys:[NSArray arrayWithObjects:@"rut", nil]];
NSData *jsonData = [jsonWriter dataWithObject:dict];

//URL
NSURL *url = [NSURL URLWithString:@"URL"];


NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
//[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:token forHTTPHeaderField:@"X-Auth-Token"];//TOKEN
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: jsonData];

NSError *error = [[NSError alloc] init];
NSHTTPURLResponse *response = nil;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

NSLog(@"Response code: %d", [response statusCode]);
NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];

SBJsonParser *jsonParser = [SBJsonParser new];
NSDictionary *jsonResponse = (NSDictionary *) [jsonParser objectWithString:responseData error:nil];//I'm a Json Refunds


self.list = [jsonResponse valueForKey:@"refunds_view"];
NSLog(@"Quantity of Refunds Founds %i",[self.list count]);

refunds_view = [[NSMutableArray alloc] init];


for (NSDictionary *each_refunds in self.list) {
    //NSLog(@"each_refound %@",each_refunds);
    Refunds *refunds = [[Refunds alloc] initWithJSONData:each_refunds];
    [refunds_view addObject:refunds];
}   
}

I need Fix it ASAP. Thanks. Best Regards.

Hi everyone. I try this

NSLog(@"%@",[current company]);

2014-06-26 10:32:13.917 Benefits[7178:70b] (
Benefits
)

cell.sol_number.text = [NSString stringWithFormat:@"%@", current.company];

no occurs the error But the value doesn't show complete, only show (

Any idea for this. Thanks.

Upvotes: 2

Views: 135

Answers (3)

Mrunal
Mrunal

Reputation: 14118

The problem is in your method definition in .mm file, instead of NSDictionary you have used NSArray in method parameters. Other than that your code and logic is fine.

Refunds.h

#import <Foundation/Foundation.h>

 @interface Refunds : NSObject

 -(id)initWithJSONData:(NSDictionary*)data;

Whereas in Refunds.mm file

#import "Refunds.h"

 @implementation Refunds 

 -(id)initWithJSONData:(NSArray*)data{ ... }

I would suggest, always try to do copy-paste to avoid such human errors.

Upvotes: 1

Vinaykrishnan
Vinaykrishnan

Reputation: 768

cell.date_admission.text = [[current objectAtIndex:0] company];

Upvotes: 0

Suhail kalathil
Suhail kalathil

Reputation: 2693

 Rewrite your Refund.m like below

    #import "Refunds.h"

     @implementation Refunds 

     @synthesize refunds_id;
     @synthesize request_number;
     @synthesize policy_code;
     @synthesize company;

-(id)initWithJSONData:(NSDictionary*)data
{
     self = [super init];
     if(self)
    {
        NSLog(@"initWithJSONData method called ");

        refunds_id =  data[@"id"];
        request_number = data[@"request_number"];
        policy_code = data[@"policy_code"];
        company = data[@"company"];
    }
        return self;
}
    @end

Upvotes: 2

Related Questions