#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];