菜鸟教程小白 发表于 2022-12-13 14:54:50

ios - 为什么 reloadRowsAtIndexPaths 不适用于 iOS 5.0?


                                            <p><p>已解决:请参阅下面的答案(以及可能的解释)。</p>

<p>我正在制作一个适用于 iOS 5.1 设备的应用,但不适用于 iOS 5.0 设备。这是适用于 5.1 但不适用于 5.0 的故障代码:</p>

<pre><code>- (void) expandIndexPath: (NSIndexPath *) indexPath afterDelay: (BOOL) delay
{
    NSIndexPath *oldSelectedIndexPath = ;
    self.mySelectedIndex= indexPath.row;
//;
    , oldSelectedIndexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
//;
}
</code></pre>

<p>更奇怪的是,如果我将 <code>reloadRowsAtIndexPaths</code> 行替换为 <code>;</code>,它可以在 iOS 5.0 中使用。为什么是这样? 5.0 是否有关于 reloadRowsAtIndexPaths 行的错误?我已经在 5.0 上尝试过使用和不使用 <code>begin/endUpdates</code> 行,但都不起作用。 </p>

<p>编辑:更具体地说,当我在 iOS 5 上运行该应用程序时,它会崩溃并出现以下错误:</p>

<blockquote>
<p><em>*</em> Assertion failure in <code>-</code>, <code>/SourceCache/UIKit/UIKit-1912.3/UITableViewSupport.m:386</code>
</p>

<p>Terminating app due to uncaught exception &#39;<code>NSInternalInconsistencyException</code>&#39;, reason: &#39;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.&#39;</p>
</blockquote>

<p>编辑:这是我的 UITableViewDataSource 方法。</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&#39;s best for me to cache them
    // (There are very few cells so it doesn&#39;t really matter)
    CellController *controller = ;
    return controller.myCell;
}

- numberOfSectionsInTableView: always returns 1;
</code></pre>

<p>唯一有趣的方法是</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>正如快速概述这部分程序的工作原理一样,当用户点击一个单元格时,该单元格会滚动到屏幕顶部。在它位于屏幕顶部后,它的索引被设置为 <code>self.mySelectedIndex</code> 并扩展(变得更高)。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我找到了一个可行的解决方案。如果我将 <code>expandIndexPath</code> 方法更改为此它可以工作:</p>

<pre><code>- (void) expandIndexPath: (NSIndexPath *) indexPath afterDelay: (BOOL) delay {
    ;
    NSIndexPath *oldSelectedIndexPath = ;
    self.mySelectedIndex= indexPath.row;
    if(oldSelectedIndexPath.row &gt;= 0)
    {
      ,oldSelectedIndexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
    }
    else
    {
      ,nil] withRowAnimation:UITableViewRowAnimationNone];
    }
    ;
}
</code></pre>

<p>据我所知,问题在于 <code>oldSelectedIndexPath</code> 有时被设置为负行值。因此,当我尝试重新加载带有负数行的 indexPath 时,它在 iOS 5.0 中崩溃了。 iOS 5.1 似乎修复了这个问题并进行了更多的错误检查。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为什么 reloadRowsAtIndexPaths 不适用于 iOS 5.0?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/11549620/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/11549620/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为什么 reloadRowsAtIndexPaths 不适用于 iOS 5.0?