0

Я пытаюсь переключить cell.textLabel.text (два разных массива) с выбраннымSegmentIndex. Первый с selectedSegmentIndex = 1 работает отлично.NSRangeException в cellForRowAtIndexPath с selectedSegmentIndex

но второй делает аварии:

uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010ed70c65 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010e92abb7 objc_exception_throw + 45 
    2 CoreFoundation      0x000000010ec5a093 -[__NSArrayM objectAtIndex:] + 227 
    3 ChillN        0x000000010be0363b -[EditFriends tableView:cellForRowAtIndexPath:] + 187 
    4 UIKit        0x000000010d2b99e8 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508 
    5 UIKit        0x000000010d298208 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2853 

... 

Вот мой код: viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.currentUser = [PFUser currentUser]; 

    PFQuery *query = [PFUser query]; 
    [query orderByAscending:@"name"]; 
// [query whereKey:@"objectId" notEqualTo:self.currentUser.objectId]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (error) { 
      NSLog(@"Error: %@ %@", error, [error userInfo]); 
     } 
     else { 
      self.allUsers = objects; 
      [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
     } 
    }]; 

    self.tableData = [[NSMutableArray alloc] init]; 
    [self getPersonOutOfAddressBook]; 
} 

numberOfRowsInSection:

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    switch (self.segment.selectedSegmentIndex) 
    { 
     case 0: 
      return [self.allUsers count]; 
      break; 
     case 1: 
      return [self.tableData count]; 
      break; 
    } 
    return 0; 
} 

cellforrowatindexpath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

//  UIImageView *accessoryView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
//  [accessoryView setImage:[UIImage imageNamed:@"circle_arrow_right.png"]]; 
//  [cell setAccessoryView:accessoryView]; 

    PFUser *selected = [self.allUsers objectAtIndex:indexPath.row]; 
    if ([self isFriend:selected]) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    Person *person = [self.tableData objectAtIndex:indexPath.row]; 
    switch (self.segment.selectedSegmentIndex) 
    { 

     case 0: 
      cell.textLabel.text = [[self.allUsers objectAtIndex:indexPath.row] valueForKey:@"surname"]; 
      break; 

     case 1: 
      cell.textLabel.text = person.fullName; 
      break; 
    } 
    return cell; 
} 

индекс изменился:

-(IBAction) segmentedControlIndexChanged 
{ 
    if(self.segment.selectedSegmentIndex == 0) 
    { 
     self.tableView.hidden = NO; 
    } 
    else if (self.segment.selectedSegmentIndex == 1) 
    { 

     self.tableView.hidden = NO; 
    } 
    [self.tableView reloadData]; 
} 

Как я могу это исправить? :)

+0

Проблема заключается в этой строке: PFUser * выбранный = [self.allUsers objectAtIndex: indexPath.row]; – azimov

+0

Что делать, если ваш номерOfRowsInSection использует self.tableData для проверки количества ячеек в таблицеView. Если self.tableData = 3, но self.allUsers имеет только 2 объекта, тогда он сработает – azimov

+0

@gottlieb, когда вы правы, когда self.tableData = 3 (или больше) и self.allUsers имеет только 2 объекта, это сбой. Так что я должен исправить? – Viny76

ответ

1

Ваш код может рухнуть на этих линиях

PFUser *selected = [self.allUsers objectAtIndex:indexPath.row]; или Person *person = [self.tableData objectAtIndex:indexPath.row];

Это потому, что вы не проверить, если selectedSegmentIndex был изменен. Так что, если TableView DataSource будет использовать self.allUsers тогда [self.tableData objectAtIndex:indexPath.row]; может рухнуть, если он будет использовать self.tableData то [self.allUsers objectAtIndex:indexPath.row]; может рухнуть

Я исправил код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"Cell"; 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

     switch (self.segment.selectedSegmentIndex) 
     { 
      case 0: 

     PFUser *selected = [self.allUsers objectAtIndex:indexPath.row]; 
     if ([self isFriend:selected]) { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } else { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     cell.textLabel.text = [[self.allUsers objectAtIndex:indexPath.row] valueForKey:@"surname"]; 
       break; 

      case 1: 
       Person *person = [self.tableData objectAtIndex:indexPath.row]; 
       cell.textLabel.text = person.fullName; 
       break; 
     } 
     return cell; 
    } 
+0

Спасибо человеку, но он по-прежнему не работает с вашим кодом: PFUser * selected = [self.allUsers objectAtIndex: indexPath.row]; не распознается и Person * person = [self.tableData objectAtIndex: indexPath.row]; ни. :( – Viny76

+0

вы получаете такой же крах? – azimov

+0

Нет, хорошо, все в порядке, если утверждение, а не переключатель;) – Viny76

 Смежные вопросы

  • Нет связанных вопросов^_^