我的 UITableView 不会向下滚动到数据的末尾!为啥?

Posted

技术标签:

【中文标题】我的 UITableView 不会向下滚动到数据的末尾!为啥?【英文标题】:My UITableView won't scroll down through the end of the data! Why?我的 UITableView 不会向下滚动到数据的末尾!为什么? 【发布时间】:2011-11-08 11:59:16 【问题描述】:

好吧,我不知道为什么这不起作用,但我已经连接了一个 tableView,我想为每个单元格设置 19 项文本。

单元格填充得很好,但是当我尝试滚动时,它会向下滚动,我可以看到在初始视图中不可见的单元格,它挂起并且不会向下滚动。它只是弹回来。真的很奇怪!

我做错了什么?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
// Return the number of sections.
return 1;



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section    
// Return the number of rows in the section.
return 19;



// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


// Configure the cell...
if(indexPath.row == 0)
    cell.textLabel.text = @"";
else if(indexPath.row == 1)
    cell.textLabel.text = @"";
else if(indexPath.row == 2)
    cell.textLabel.text = @"";
else if(indexPath.row == 3)
    cell.textLabel.text = @"";
else if(indexPath.row == 4)
    cell.indentationLevel = 2;
    cell.textLabel.text = @"";
else if(indexPath.row == 5)
    cell.indentationLevel = 2;
    cell.textLabel.text = @"";
else if(indexPath.row == 6)
    cell.indentationLevel = 2;      
    cell.textLabel.text = @"";
else if(indexPath.row == 7)
    cell.indentationLevel = 2;      
    cell.textLabel.text = @"";
else if(indexPath.row == 8)
    cell.indentationLevel = 2;      
    cell.textLabel.text = @"";
else if(indexPath.row == 9)
    cell.textLabel.text = @"";
else if(indexPath.row == 10)
    cell.textLabel.text = @"";
else if(indexPath.row == 11)
    cell.textLabel.text = @"";
else if(indexPath.row == 12)
    cell.textLabel.text = @"";
else if(indexPath.row == 13)
    cell.textLabel.text = @"";
else if(indexPath.row == 14)
    cell.textLabel.text = @"";
else if(indexPath.row == 15)
    cell.textLabel.text = @"";
else if(indexPath.row == 16)
    cell.textLabel.text = @"";
else if(indexPath.row == 17)
    cell.textLabel.text = @"";
else if(indexPath.row == 18)
    cell.textLabel.text = @"";


return cell;

【问题讨论】:

所有单元格都是空字符串文本标签。你真的确定你没有正确滚动并且因为所有的单元格看起来都一样而无法分辨吗? 【参考方案1】:

减小您的 tableView 的高度

【讨论】:

您好,我也遇到了同样的问题。我尝试减小表格视图的大小,但它仍然不会滚动到底部,只是向上滚动到表格视图的第一个单元格/顶部。 我认为以下原因之一会导致此问题。 1. 桌面高度超出设备高度。 2. 其他一些 UI 元素与表格底部重叠。 3. 自上次加载以来,表格数据发生了变化。【参考方案2】:

我知道这是一个老问题,这不是对您问题的回答,而是建议改进您的代码,以便其他人受益。

你可以这样写:

if (indexPath.row >= 4 && indexPath.row <= 8)  // 4 and 8 inclusive
    cell.indentationLevel = 2;

cell.textLabel.text = @"";

改为:

if(indexPath.row == 0)
    cell.textLabel.text = @"";
else if(indexPath.row == 1)
    cell.textLabel.text = @"";
else if(indexPath.row == 2)
    cell.textLabel.text = @"";
else if(indexPath.row == 3)
    cell.textLabel.text = @"";
else if(indexPath.row == 4)
    cell.indentationLevel = 2;
    cell.textLabel.text = @"";
else if(indexPath.row == 5)
    cell.indentationLevel = 2;
    cell.textLabel.text = @"";
else if(indexPath.row == 6)
    cell.indentationLevel = 2;      
    cell.textLabel.text = @"";
else if(indexPath.row == 7)
    cell.indentationLevel = 2;      
    cell.textLabel.text = @"";
else if(indexPath.row == 8)
    cell.indentationLevel = 2;      
    cell.textLabel.text = @"";
else if(indexPath.row == 9)
    cell.textLabel.text = @"";
else if(indexPath.row == 10)
    cell.textLabel.text = @"";
else if(indexPath.row == 11)
    cell.textLabel.text = @"";
else if(indexPath.row == 12)
    cell.textLabel.text = @"";
else if(indexPath.row == 13)
    cell.textLabel.text = @"";
else if(indexPath.row == 14)
    cell.textLabel.text = @"";
else if(indexPath.row == 15)
    cell.textLabel.text = @"";
else if(indexPath.row == 16)
    cell.textLabel.text = @"";
else if(indexPath.row == 17)
    cell.textLabel.text = @"";
else if(indexPath.row == 18)
    cell.textLabel.text = @"";

如果您碰巧在每种情况下都有不同的文本,您可以使用:

switch (indexPath.row) 
    case 0:
        cell.textLabel.text = @"";
        break;
        ...
    case 18:
        cell.textLabel.text = @"";
    default:
        break;

或者甚至更好地将所有内容放在NSArray(数据库...)中,然后按索引循环遍历它们。

【讨论】:

【参考方案3】:

这对我有帮助:

[self.tableView setContentInset:UIEdgeInsetsMake(0,0,65,0)];

【讨论】:

能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述? 在更改我的表格视图以使用来自 xib 的标题单元格后,我遇到了滚动问题。这解决了我的问题,但我怀疑它可能导致下游的问题。肯定有别的事情发生了……【参考方案4】:

@EmptyStack 答案是正确的。那是替代方案,但不是解决方案。

即使我们可以在故事板中实现相同的效果。

选择 tableView --> 从情节提要控件中单击“添加缺少的约束”。 这会将约束添加到 tableView 和 View。

这帮助我解决了这个问题。 附上截图供参考。

【讨论】:

请记住,“添加缺少的约束”可以为边距添加约束,ios8 之前的版本不支持这些约束。【参考方案5】:

您分享的代码对我来说看起来不错。您是否在导航控制器堆栈上使用此 tableview 推送视图控制器?我以前见过人们这样做。单元格的默认高度是 44px,导航栏的高度也是 44px。因此,如果您将其推送到导航控制器堆栈上,您的滚动视图会像您所描述的那样快速返回。如果是这种情况,请将 TableView 的高度减少 44 px(在界面生成器中,或者如果您以编程方式绘制它,则以编程方式)并且它应该修复它。

【讨论】:

其实我相信这是真正的答案。当然,自我框架包括导航栏。我猜它可以通过 UIApplication.shared.statusBarFrame.size.height + (self.navigationController?.navigationBar.frame.height ?? 0.0) 这也是旋转的问题,高度和宽度不会自动设置正确。 在这种情况下使用约束似乎是 iOS 中唯一真正有效的方式。使用约束列表滚动到最后。【参考方案6】:

如果你有故事板或笔尖,试试这个(注意,如果你想支持横向,你可能需要添加一些约束)。

【讨论】:

【参考方案7】:

我遇到了同样的问题。

检查你看不到的行号。

在你的 viewDidLoad 之后,添加这个方法:

myTableView.contentInset = UIEdgeInsets(top: 0,left: 0,bottom: yourCellHeight * rowHeight,right: 0)

希望对你有所帮助

【讨论】:

【参考方案8】:

您需要调整 UITableView 的高度,或者您可以尝试将 [tableView reloadData] 放入 viewDidAppear 方法(如果放入 viewWillAppear 或 viewDidLoad 似乎不起作用)。

在大多数情况下,前者对我有用。

【讨论】:

【参考方案9】:

我禁用了自动估算,它对我有帮助。

【讨论】:

以上是关于我的 UITableView 不会向下滚动到数据的末尾!为啥?的主要内容,如果未能解决你的问题,请参考以下文章

重新加载 UITableView 数据并向下滚动到最后选择的单元格

在我滚动之前,数据不会加载到 UITableView 中

UITableView 仅在向上滚动时更新,而不是向下滚动

一直向下滚动到 UITableView 的底部

EXC_BAD_ACCESS 仅在从 UITableView 中一直向下滚动返回时

向下滚动时,UITableview 看不到最后一个单元格