Ошибка при установке значений из JSON в моей UITableViewCell

#ios #json #xcode #xcode5

#iOS #json #xcode #xcode5

Вопрос:

У меня проблема при установке значений на моем UITableViewCell . Я получаю эти данные из веб-службы в формате JSON, для этого создан класс, который содержит все данные из JSON.

Это класс.

Возврат.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
 

Возврат.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
 

В ViewController, где я использую UITableVIew , у меня есть эта реализация

 NSMutableArray refunds_view = [[NSMutableArray alloc] init];

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

В методе

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

У меня это:

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

В строке cell.date_admission.text = [текущая компания]; выдает следующую ошибку

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

Это формат JSON.

 [
{
    "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:amp;response error:amp;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];
}   
}
 

Мне нужно исправить это как можно скорее.
Спасибо.
С наилучшими пожеланиями.

Всем привет. Я пытаюсь это

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

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

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

ошибка не возникает, но значение не отображается полностью, отображается только (

Любая идея для этого. Спасибо.

Комментарии:

1. Попробуйте ввести журнал при инициализации объекта. Там проверьте, присваивается ли правильное значение «company» или нет. Я думаю, есть проблема

2. Почему initWithJSONData принимает NSArray ?

3. Почему вы используете assign для NSNumber свойств?

4.Спасибо @Mrunal Это журнал NSLog (@»company%@», [текущая компания]); 2014-06-26 02:55:08.466 Benefits[6389:70b] company ( Benefits )

5. Попробуйте cell.date_admission.text = [[current company] objectAtIndex:0]; и проверьте, работает это или нет.

Ответ №1:

  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
 

Комментарии:

1. Поставьте точку останова в методе initWithJsonData и проверьте, все свойства получают значение или нет.

2.Я пробую это, и это ошибка при перезаписи Refund.m -[__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance 0x8abbbe0 2014-06-26 03:05:21.604 Benefits[6467:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance 0x8abbbe0'

3. пожалуйста, отправьте NSLog словаря each_refunds

4.это NSLog (@»%@», each_refunds) 2014-06-26 03:11:43.496 Benefits[6520:70b] each_refound ( { "account_number" = 1234567; amount = 20000; bank = Estado; "beneficiary_id" = 1; company = Benefits; concept = "Prueba More"; "created_at" = "2014-06-18 21:55:41"; date = "2014-05-21"; "deductible_amount" = 0; id = 60; "max_applied" = 0; "payment_amount" = 14000; } )

5. хорошо, я сделал это, но оставил класс как был, и каждый из них заполнен значением, соответствующим JSON

Ответ №2:

Проблема заключается в определении вашего метода в файле .mm, вместо NSDictionary вы использовали NSArray в параметрах метода. Кроме этого, ваш код и логика в порядке.

Возврат.h

 #import <Foundation/Foundation.h>

 @interface Refunds : NSObject

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

В то время как в Refunds.mm файл

 #import "Refunds.h"

 @implementation Refunds 

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

Я бы посоветовал всегда стараться копировать-вставлять, чтобы избежать таких человеческих ошибок.

Ответ №3:

cell.date_admission.text = [[текущий objectAtIndex:0] company];