title: Why does reloadRowsAtIndexPaths not work for iOS 5.0?
body: <p>SOLVED: See my answer (and possible explanation) below.</p>
  
  <p>I'm making an app that works on iOS 5.1 devices, but not on iOS 5.0 devices.  Here is the trouble code that works on 5.1 but NOT on 5.0: </p>
  
  <pre><code>- (void) expandIndexPath: (NSIndexPath *) indexPath afterDelay: (BOOL) delay
  {
      NSIndexPath *oldSelectedIndexPath = [NSIndexPath indexPathForRow:self.mySelectedIndex inSection:0];
      self.mySelectedIndex= indexPath.row; 
  //  [self.myTableView beginUpdates];
      [self.myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:self.mySelectedIndex inSection:0], oldSelectedIndexPath,nil] withRowAnimation:UITableViewRowAnimationNone]; 
  //  [self.myTableView endUpdates];
  }
  </code></pre>
  
  <p>Even more curiously, it works in iOS 5.0 if I replace the <code>reloadRowsAtIndexPaths</code> line with <code>[self.myTableView reloadData];</code>.  Why is this? Did 5.0 have a bug regarding the reloadRowsAtIndexPaths line?  I've tried it on 5.0 with and without <code>begin/endUpdates</code> lines and neither works.  </p>
  
  <p>EDIT: To be more specific, when I run the app on iOS 5 it crashes with the following error: </p>
  
  <blockquote>
    <p><em>*</em> Assertion failure in <code>-[_UITableViewUpdateSupport _computeRowUpdates]</code>, <code>/SourceCache/UIKit/UIKit-1912.3/UITableViewSupport.m:386</code>
    [Switching to process 7171 thread 0x1c03]</p>
    
    <p>Terminating app due to uncaught exception '<code>NSInternalInconsistencyException</code>', reason: 'Invalid table view
    update.  The application has requested an update to the table view
    that is inconsistent with the state provided by the data source.'</p>
  </blockquote>
  
  <p>EDIT: Here are my UITableViewDataSource methods.</p>
  
  <pre><code>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  {
      //I am positive that this will ALWAYS return the number (it never changes)
      return self.myCellControllers.count;
  }
  
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
      //I cache my table view cells, thus each time this method gets called it will 
      // return the exact same cell. Yes, I know that most of the time I should be dequeing
      // and reusing cells; just trust me that this time, it's best for me to cache them
      // (There are very few cells so it doesn't really matter)
      CellController *controller = [self.myCellControllers objectAtIndex:indexPath.row];
      return controller.myCell;
  }
  
  - numberOfSectionsInTableView: always returns 1;
  </code></pre>
  
  <p>The only interesting method is </p>
  
  <pre><code>- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  {
      if(indexPath.row == self.mySelectedIndex)
      {
          return DEFAULT_CELL_HEIGHT + self.expandSize;
      }
      else
      {
          return DEFAULT_CELL_HEIGHT;
      }
  }
  </code></pre>
  
  <p>Just as a quick overview of how this part of the program works, when a user taps a cell, the cell scrolls to the top of the screen. After it is at the top of the screen it's index gets set as <code>self.mySelectedIndex</code> and it expands (gets taller).</p>