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

iphone - UITableView reloadData 方法造成数据模糊的麻烦


                                            <p><p>我有一个 <code>UITableView</code> ,其中每个 <code>UITableViewCell</code> 上都有一个 <code>UIView</code> 及以上 <code>UIView</code> 我有两个 <code>UIButton</code> 和两个 <code>UILabel</code>。我的问题是,当我重新加载表格 View 时,新数据被重写在使内容模糊不清的旧数据上,并且在方法 <code>cellForRowAtIndexPath</code> 我使用了这个删除标签的代码然后它也不起作用正确.......</p>

<pre><code>NSArray *subviews = [ initWithArray:cell.contentView.subviews];
    for (UILabel *subview in subviews) {
      ;
    }
    ;
</code></pre>

<p>此代码一次显示一行,否则没有人...</p>

<p><code>cellForRowAtIndexPath</code>的代码是这样的......</p>

<pre><code>- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath {   
    static NSString *identifier = @&#34;Cell&#34;;
    UITableViewCell *cell = ;
    if (cell == nil) {
      cell = [[ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSDictionary *dict = ;

    tableView.backgroundColor = ;

    if(&gt;0){

      imgView.backgroundColor = ;
      imgView =[ initWithFrame:CGRectMake(0,0,320,45)];
      imgView.tag= indexPath.row+250;
      ;

      button=;
      button.frame=CGRectMake(291, 5, 19, 21);
      img = pathForResource:@&#34;swap_re&#34; ofType:@&#34;png&#34;]];
      ;
      ;
      button.tag= indexPath.row+250;
      ;

      button=;
      button.frame=CGRectMake(-25, 5, 19, 21);
      img = pathForResource:@&#34;swap_re&#34; ofType:@&#34;png&#34;]];
      ;
      ;
      button.tag= indexPath.row+250;
      ;

      button=;
      button.frame=CGRectMake(5, 7, 19, 21);
      button.tag = indexPath.row+250;
      img = pathForResource:@&#34;delete&#34; ofType:@&#34;png&#34;]];
      ;
      ;   
      ;

      NSArray *arr = [ componentsSeparatedByString:@&#34;/&#34;];


      UILabel *label = [ initWithFrame:CGRectMake(34,9,140,20)];
      label.text = ;
      label.tag = indexPath.row+250;
      ];
      ;
      label.textAlignment = UITextAlignmentLeft;
      label.textColor = ;
      label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
      label.backgroundColor = ;
      ;
      ;

      NSDictionary *dict1 =;


      label = [ initWithFrame:CGRectMake(181, 7, 75, 20)];
      label.tag = indexPath.row+250;
      label.text = ;
      ];
      label.textAlignment = UITextAlignmentLeft;
      ];
      label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
      ];
      ;
      ;
    }
    return cell;
}
</code></pre>

<p>在我的代码中,我无法使用 <code>reuseTableViewCellWithIdentifier:</code> 方法,因为我希望每个标签和按钮标签都应该相同,因为我必须在其他地方获取它们。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是因为你做错了。您甚至不需要重新加载表格。只需滚动一下,您就会注意到它。<br/>
每次显示单元格时,您都会创建新的标签和按钮。当然,这些 UI 元素永远不会被删除。 </p>

<p>在创建新单元格时添加 UI 元素并给它们一个标签。
如果单元格成功出列,则通过该标记获取元素并设置其值。</p>

<p>像这样:</p>

<pre><code>if (cell == nil) {
    // if no cell could be dequeued create a new one
    cell = [[ initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

    // add label to the new cell
    UILabel *label = [ initWithFrame:CGRectMake(34,9,140,20)];
    label.tag = 250;// &lt;---- save tag
    ];
    ;
    label.textAlignment = UITextAlignmentLeft;
    label.textColor = ;
    label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
    label.backgroundColor = ;
    //; // I ignore this because I don&#39;t want to write 200 lines of code here. This is just an example so please adopt the code yourself
    ;
    ;
}

// whatever happened you have a cell with all the labels added here

UILabel *label = (UILabel *)      // &lt;---- get label with tag
label.text = ;
</code></pre>

<hr/>

<p>而且您不需要 <code>if(>0)</code>。如果所有其他 tableview 数据源方法都正确 <code>tableView:cellForRowAtIndexPath:</code> 如果您的数据源为空,则不会调用。</p>

<hr/>

<p>编辑:刚刚看到那个:</p>

<blockquote>
<p>and in my code i am not able to use the method reuseTableViewCellWithIdentifier: because i want each label and button tag should be same because i have to fetch them else where.</p>
</blockquote>

<p>其实你可以。每个人都可以而且应该使用 <code>reuseTableViewCellWithIdentifier:</code>.<br/>
您对此的具体问题是什么?<br/>
如果您需要在按钮操作方法中获取 indexPath(或者在您的情况下只有行),请使用我的 <a href="https://stackoverflow.com/a/3911001/457406" rel="noreferrer noopener nofollow">answer to another question</a> 中的代码</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - UITableView reloadData 方法造成数据模糊的麻烦,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/8519026/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/8519026/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - UITableView reloadData 方法造成数据模糊的麻烦