简体   繁体   中英

(Terminating app due to uncaught exception 'NSInvalidArgumentException)

I am using uitableview for showing the json parsed data . the parsed data is stored in array and the array list is 100 asigned to uitableview. but it crashing at objectAtIndex at {forloop} it showing crash report as

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 0' *

plese help me

   - (void)viewDidLoad
{
    self.responseData = [NSMutableData data];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:openexchangeURl]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [super viewDidLoad];

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{
    [responseData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    [responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [connection release];
    self.responseData = nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{
    [connection release];

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    self.responseData = nil;

    values = [responseString JSONValue];
    array = [[NSMutableArray alloc] init];
    NSMutableArray *arrTitle = [[NSMutableArray alloc] init];
    NSMutableArray *arrValues = [[NSMutableArray alloc] init];
    array =[values valueForKey:@"rates"];

    NSLog(@"array values:--> %@",array);
//    NSLog(@"values:--> %@",values);
//    NSLog(@"Particular values:--> %@",[[values valueForKey:@"rates"] valueForKey:@"AED"]);

    tempDict1 = (NSMutableDictionary *)array;            
    NSArray *arr;// =[[NSArray alloc]init];
    arr = [[tempDict1 valueForKey:@"rates"] componentsSeparatedByString:@";"];
    NSLog(@"arr-->%@",arr);
    NSString *subStar = @"=";
    [arrTitle removeAllObjects];
    [arrValues removeAllObjects];

    for (int i=0; i<[arr count]-1; i++)
    {
        [arrTitle addObject:[[arr objectAtIndex:i] substringToIndex:NSMaxRange([[arr objectAtIndex:i] rangeOfString:subStar])-1]];
        [arrValues addObject:[[arr objectAtIndex:i] substringFromIndex:NSMaxRange([[arr objectAtIndex:i] rangeOfString:subStar])]];
        NSLog(@"arrTitle is:--> %@",arrTitle);
    }

    tempDict1 = (NSMutableDictionary*)[array objectAtIndex:0];
    array = [values valueForKey:@"rates"];
    NSLog(@"tempDict--%@",[tempDict1 objectForKey:@"AED"]);

    [array retain];
    [tbl_withData reloadData];

}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"array-->%@",array);
    return [array count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    intIndexPath = indexPath.row;
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.adjustsFontSizeToFitWidth = YES; 
        cell.textLabel.font = [UIFont systemFontOfSize:8]; 
        cell.textLabel.numberOfLines = 4; 

    }

//    NSLog(@"data is like:--> %@",array);
//    cell.textLabel.text= [NSString stringWithFormat:@"%@",[array objectAtIndex:intIndexPath]];
    cell.textLabel.text =[array objectAtIndex:intIndexPath];

    return cell;
}

There is only one item in your array, here is where you add just the one object:

array = [[NSMutableArray alloc] init];
[array addObject:[values valueForKey:@"rates"]];

You should assign the the value that you get from the [values valueForKey:@"rates"] to the array variable. Also make the array variable a property that will retain the value.

@property (nonatomic, strong) NSArray *array;

then assign it to the property:

self.array  = [values valueForKey:@"rates"];

Also move all styling of the cell to the if where you create the new cell. This will speed thing up, since you not change the style of the cell every time.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
       cell.textLabel.adjustsFontSizeToFitWidth = YES;  
       cell.textLabel.font = [UIFont systemFontOfSize:8];  
       cell.textLabel.numberOfLines = 4;  

    }
    NSLog(@"data is like:--> %@",array);
    //    NSString *cellValue =[array objectAtIndex:indexPath.row];
    //    cell.textLabel.text = cellValue;

    cell.textLabel.text= [NSString stringWithFormat:@"%@",[array objectAtIndex:indexPath.row]];

    return cell;
}

Get your data from server in correct format...in your situation your data is in one array. so make it in different different array..

{"reply":["AED = 3.673188","AFN = 48.5725","","","",""]}

or you can parse your response and save single single data into another array...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM