菜鸟教程小白 发表于 2022-12-13 10:53:47

ios - 从 uitableview cellForRowAtIndexPath 委托(delegate)中删除行时应用程序崩溃


                                            <p><p>我有一个表格 View 。我正在实现一个功能,其中单元格将开始褪色(在 30 秒的时间内减少 alpha)。完成 30 秒后, View 动画的完成处理程序被调用以从数据源中永久删除行(一个数组)。所有的东西都在 cellForRowAtIndexPath 委托(delegate)方法中。
我的问题是在更新前和更新后的数组计数之间保持同步。</p>

<p>代码:</p>

<pre><code>- (UITableViewCell *)tableView:(UITableView *)tableView
   cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *postCellId = @&#34;postCell&#34;;
    UITableViewCell *cell = nil;

    NSUInteger row = ;
    cell = ;
    if (cell == nil) {
      cell = [[
             initWithStyle:UITableViewCellStyleSubtitle
             reuseIdentifier:postCellId] autorelease];
    }

    Post *currentPost = ;
    cell.textLabel.text = ;
    cell.textLabel.font = ;

    cell.detailTextLabel.text = ;
    cell.detailTextLabel.font = ;

    NSTimeInterval duration = 30;
    [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
               animations:^ {
         cell.contentView.alpha = 0;
    } completion:^(BOOL finished) {
      ;
      NSLog(@&#34;delete index &gt;&gt; %d from array &gt;&gt; %@&#34;, row, posts);
      ;
       withRowAnimation:UITableViewRowAnimationNone];
      ;
    }];

    return cell;
}
</code></pre>

<p>日志:</p>

<blockquote>
<p>2015-06-04 07:22:05.764 Feeder delete index &gt;&gt; 0 from array</p>

<blockquote>
    <blockquote>
      <p>(
          &#34;&#34;,
          &#34;&#34;,
          &#34;&#34;,
          &#34;&#34;,
          &#34;&#34; )2015-06-04 07:22:05.766 Feeder delete index &gt;&gt; 1 from array &gt;&gt;(
          &#34;&#34;,
          &#34;&#34;,
          &#34;&#34;,
          &#34;&#34; ) 2015-06-04 07:22:05.767 Feeder delete index &gt;&gt; 2 from array &gt;&gt; (
          &#34;&#34;,
          &#34;&#34;,
          &#34;&#34; ) 2015-06-04 07:22:05.768 Feeder <strong>delete index &gt;&gt; 3 from array</strong> &gt;&gt; (
          &#34;&#34;,
          &#34;&#34; )</p>
    </blockquote>
</blockquote>
</blockquote>

<p><strong>如果你看到最后的日志,那就是崩溃的问题。</strong></p>

<p>崩溃日志:</p>

<blockquote>
<p>2015-06-04 07:22:05.770 Feeder <strong>* Terminating app due to
uncaught exception &#39;NSRangeException&#39;, reason: &#39;*</strong> -[__NSArrayM
removeObjectAtIndex:]: index 3 beyond bounds &#39;</p>
</blockquote>

<p>如何解决它。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的错误是您将旧的 indexPath 保留在 block 中,而不是更新它。</p>

<p>例如:
如果您的数组中有 2 条记录,则您在完整 block 中的操作是</p>

<ol>
<li>删除第 0 行</li>
<li>删除第 1 行</li>
</ol>

<p>但是,如果你删除第一个单元格(第 0 行),你的第 1 行 indexPath.row 会更新为 0。但是你想删除 1。</p>

<p>所以,我认为你可以动态获取 indexPath,然后删除</p>

<pre><code>;
NSIndexPath *path = ;
NSLog(@&#34;delete index &gt;&gt; %d from array &gt;&gt; %@&#34;, path.row, posts);
;
withRowAnimation:UITableViewRowAnimationNone];
;
</code></pre>

<p>我不确定这是否可行,请尝试。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 uitableview cellForRowAtIndexPath 委托(delegate)中删除行时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30633807/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30633807/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 uitableview cellForRowAtIndexPath 委托(delegate)中删除行时应用程序崩溃