应用由于未捕获的异常而终止' NSRangeException'

时间:2017-12-19 18:06:06

标签: ios objective-c arrays uitableview

我试图在横向模式下在表格上显示数组的值,但是我收到以下错误并且它崩溃了应用程序:

由于未捕获的异常终止应用' NSRangeException',原因:' * - [__ NSCFString substringToIndex:]:索引9223372036854775807超出范围;字符串长度10' **。

这是我的代码:

- (void)viewWillAppear:(BOOL)animated {

     [super viewWillAppear:YES];
     NSLog(@"Orientation Current: %ld", (long)[[UIApplication sharedApplication] statusBarOrientation]);

if([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait) {
    NSLog(@"Here found");
    [self forceToOrientation:UIInterfaceOrientationLandscapeLeft];
  }
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [self.completedSubscriptionsTableView setNeedsLayout];
    [self.completedSubscriptionsTableView layoutIfNeeded];
 }

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self.completedSubscriptionsTableView setNeedsLayout];
    [self.completedSubscriptionsTableView layoutIfNeeded];
 }




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

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section {
   return [self.subscriberArray count];

 }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellIdentifier = @"CellIdentifier";
    UITableViewCell *cell;
    PaymentHistoryCellTableViewCell *paymentHistoryCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    [paymentHistoryCell setSelectionStyle:UITableViewCellSelectionStyleNone];
    PaymentHistory *currentPayment = [self.subscriberArray objectAtIndex:indexPath.row];
    NSLog(@"Current Payment: %@", currentPayment);
    [paymentHistoryCell.lblTransactionNo setText:[NSString stringWithFormat:@"\t%@", [[self.subscriberArray objectAtIndex:indexPath.row] valueForKey:@"Name"]]];
    [paymentHistoryCell.lblAmount setText:[NSString stringWithFormat:@"\t%@", [[self.subscriberArray objectAtIndex:indexPath.row] valueForKey:@"address"]]];

  if (indexPath.row % 2 == 0) {
    [paymentHistoryCell.contentView setBackgroundColor:[UIColor colorWithRed:232/255.0 green:232/255.0 blue:232/255.0 alpha:1.0]];
} else {
    [paymentHistoryCell.contentView setBackgroundColor:[UIColor whiteColor]];
}

    cell = paymentHistoryCell;
    [cell setNeedsLayout];
    [cell layoutIfNeeded];
    [cell layoutSubviews];
    [cell setNeedsUpdateConstraints];
    [cell updateConstraintsIfNeeded];
    return cell;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

  int space = 0;
  UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40.0)];
  [headerView setBackgroundColor:[UIColor colorWithRed:210/255.0 green:210/255.0 blue:210/255.0 alpha:1.0]];
  CGFloat viewWidth = (self.view.frame.size.width / [self.headerItems count]);
  NSLog(@"viewWidth: %f", viewWidth);

for(int i = 0; i < [self.headerItems count]; i++) {
    UILabel *headerLbl = [[UILabel alloc] initWithFrame:CGRectMake((space * i) +  (viewWidth * i), headerView.frame.origin.y, viewWidth, headerView.frame.size.height)];
    [headerLbl.layer setBorderWidth:1.0];
    [headerLbl setTextAlignment:NSTextAlignmentCenter];
    [headerLbl setText:[self.headerItems objectAtIndex:i]];
    [headerLbl setFont:[UIFont boldSystemFontOfSize:15.0]];
    [headerLbl.layer setBorderColor:[[UIColor blackColor] CGColor]];
    [headerView addSubview:headerLbl];
    }
    return headerView;
    }

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 40.0;
   }

   #pragma mark - Orientation Methods
 - (BOOL)shouldAutorotate {
   return YES;
   }
   - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 40.0;
  }


 - (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscapeLeft;
  }

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeLeft;
  }


 - (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

   if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
     [self.navigationController popViewControllerAnimated:YES];
   }else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
     [self forceToOrientation:toInterfaceOrientation];
    }
   }

 - (void)forceToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{

    NSLog(@"Forcing orientation to %ld",(long)toInterfaceOrientation);
   [[UIDevice currentDevice] setValue:
   [NSNumber numberWithInteger: UIInterfaceOrientationLandscapeLeft]
                            forKey:@"orientation"];
   }


- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];

  }

- (void)setCompletedInstallations:(NSMutableArray *)compleInstalltions {
   self.subscriberArray = [[NSMutableArray alloc]init];
   dispatch_async(dispatch_get_main_queue(), ^{
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"SubmittedAt" ascending:NO];
   self.subscriberArray = [NSMutableArray arrayWithArray:     [compleInstalltions sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]];

    NSLog(@" These are the completed subscriptions -> %@",_subscriberArray);
    [self.completedSubscriptionsTableView reloadData];
  });
}

2 个答案:

答案 0 :(得分:3)

9223372036854775807-1的无符号演员,NSNotFound。根据错误消息,您正在调用-[NSString substringToIndex:],其搜索结果无法找到您要查找的内容。

此部分代码未显示,因此请查找您认为可以拆分字符串但未正确检查实际情况的任何地方。尝试使用附加的调试器运行,它会告诉您代码的哪一行引发了报告的异常。你可以从那里向后工作。

答案 1 :(得分:1)

找不到您尝试使用的索引,从而导致崩溃。检查传递给方法[NSString substringToIndex:]

的值