无法在 iOS 中滚动表格

Posted

技术标签:

【中文标题】无法在 iOS 中滚动表格【英文标题】:unable to scroll table in iOS 【发布时间】:2017-11-21 06:16:00 【问题描述】:

我在表格视图中加载字典数组,重新加载表格后,我调用了一个方法,该方法从数组中更改字典数据,然后刷新/重新加载表格视图的特定索引。但是除非我的完整数据没有再次更新,否则我无法滚动表格。

我调用我的方法并重新加载表的代码:

- (void)parserDidEndDocument:(NSXMLParser *)parser 
    [Hud hideAnimated:true];
    [self.myTbl reloadData];
    dispatch_async(dispatch_get_main_queue(),^
         [self loadTutorials];
    );

我尝试更新表数据的方法。

#pragma mark:GetAllData
-(void)loadTutorials
  dispatch_async(dispatch_get_main_queue(),^


    int k = 0;

  for (NSMutableString*linknew in linkArr) 
     //here some calculations code for parsing then next  
      for (TFHppleElement *elements in contributorsNodes) 
        // 5
        for (TFHppleElement *child in elements.children) 
            if ([child.tagName isEqualToString:@"img"]) 
                // 7
                @try 
                    NSString*url = [child.attributes objectForKey:@"src"];

                    NSMutableDictionary*dict = [[feeds objectAtIndex:k] mutableCopy];
                    [dict setObject:url forKey:@"image"];
                    [feeds removeObjectAtIndex:k];
                    [feeds insertObject:dict atIndex:k];

                    NSIndexPath*index = [NSIndexPath indexPathForRow:k inSection:0];

                    [self.myTbl reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone];


                
                @catch (NSException *e) 
            
        
    k++;
  
  );

cellForRowAtIndexPath 方法:

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

    UILabel*lbl = (UILabel*)[cell viewWithTag:101];
    UIImageView*imgView = (UIImageView*)[cell viewWithTag:103];


    [imgView sd_setImageWithURL:[NSURL URLWithString:[[feeds objectAtIndex:indexPath.row] objectForKey:@"image"]] placeholderImage:[UIImage imageNamed:@"img.jpg"]];

    lbl.text = [NSString stringWithFormat:@"%@",[[feeds objectAtIndex:indexPath.row] objectForKey: @"title"]];

    return cell;

【问题讨论】:

我假设你是disptch_async,因为数据处理需要很长时间——如果是这样,将这项工作分派到主队列是没有意义的——尽管如此,你还是会阻塞主线程。您应该将您的工作分派到后台队列,然后将与 UI 更新相关的部分分派到主队列。 @Losiowaty 感谢您的回复。我把方法 [self.myTbl reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone];在 disptch_async 中并从我的方法开始中删除 disptch_async 但仍然是同样的问题 【参考方案1】:

你的问题中有很多东西让我感到困惑。

使用parserDidEndDocument 方法,我不知道您为什么需要调用[self.myTbl reloadData],尽管之后您在loadTutorials 方法中更新self.myTbl。 这里为什么需要调用2dispatch_async,内外loadTutorials方法?我认为没有必要。只需拨打 1 次即可。 要替换数组中的对象,您不需要删除和插入对象。只需使用feeds[k] = dict 替换即可。使用前请确保feeds.count > k。 我猜,你使用try catch是因为你在loadTutorials方法中更新self.myTbl时崩溃了。在我看来,你应该使用beginUpdatesendUpdates 而不是try catch

我认为问题在于您使用try catch 处理崩溃。

尝试按照@Losiowaty 的建议使用后台队列重写您的代码,我们将有

- (void)parserDidEndDocument:(NSXMLParser *)parser 
  [Hud hideAnimated:true];
  [self.myTbl reloadData];
  [self loadTutorials];




#pragma mark:GetAllData
-(void)loadTutorials
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
    int k = 0;

    for (NSMutableString*linknew in linkArr) 
      //here some calculations code for parsing then next
      for (TFHppleElement *elements in contributorsNodes) 
        // 5
        for (TFHppleElement *child in elements.children) 
          if ([child.tagName isEqualToString:@"img"]) 
            NSString*url = [child.attributes objectForKey:@"src"];

            // I assume in some case, feeds[k] doesn't exist. We need add an
            // NSMutableDictionary to this index before using to avoid crash.
            // If you make sure feeds[k] always exist you can ignore it

            if (feeds.count == k) 
              [feeds addObject:[[NSMutableDictionary alloc] init]];
            
            [feeds[k] setObject:url forKey:@"image"];

            NSIndexPath*index = [NSIndexPath indexPathForRow:k inSection:0];

            dispatch_async(dispatch_get_main_queue(), ^
              [self.myTbl beginUpdates];
              [self.myTbl reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone];
              [self.myTbl endUpdates];
            );
          
        
      k++;
    
  );

让我们先试试代码。如果您仍然有任何问题,请告诉我。我会帮你的。

【讨论】:

我将解析的数据存储在数组中,在文档结束后调用 parserDidEndDocument 方法并将这些存储的数据设置到表中我重新加载我的表下一个是在我的解析数据中我没有得到图像所以我点击方法loadTutorials 从中获取图像并更新数组并刷新特定单元格。我试过你的代码仍然是同样的问题。谢谢你的回复。 当我首先在方法 parserDidEndDocument 重新加载我的表格时,我的表格视图显示,之后它会卡住,当所有图像由方法 loadTutorials 更新时,它会显示图像并且我可以滚动。 明白。你能告诉我cellForRowAtIndexPath 方法吗?我想看看你是如何从 url 加载图像的。也许问题在于您加载图像的方式 我使用标签值和上传图片我使用了 sdWebImage 第三方库。 看起来不错。我已经按照@Losiowy 的建议使用后台队列更新了我的答案。请再试一次,告诉我会发生什么。

以上是关于无法在 iOS 中滚动表格的主要内容,如果未能解决你的问题,请参考以下文章

边缘表格中的溢出滚动条无法正确显示

视图中的滚动视图和滚动视图中的表格视图;我如何引用它?

无法在 Pyqt5 的 Qtext 编辑中使用 jinja2 设置表格的 CSS(文本换行和水平滚动条)

使 html 表格元素响应水平滚动

修复Extjs6.X在IE8下表格水平滚动条无法滚动的BUG

表格溢出时水平滚动