UITableView 没有正确重新加载

Posted

技术标签:

【中文标题】UITableView 没有正确重新加载【英文标题】:UITableView not reloading correctly 【发布时间】:2015-07-10 03:32:12 【问题描述】:

我经常遇到这个问题,表格视图要么第一次不加载单元格,要么显示临时标签。在这两种情况下,当第二次加载表格时(通过另一个按钮,我强制它重新加载或通过转到应用程序中的上一个视图并返回表格),一切都会按预期显示。

我使用[table reloadData]viewDidAppear: 方法中重新加载表,因为它在viewDidAppear: 方法中不起作用,在另一种情况下,我将它放在按钮操作中。

我也在使用这个方法来设置我放在故事板中的单元格的标签:

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

    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    
    UILabel *label = (UILabel *)[cell viewWithTag:1001];
    label.text = [Array3 objectAtIndex:indexPath.row];

    return cell;

编辑

我在实现下面声明数组,如: NSMutableArray * Array3; 之后在 ViewDidLoad 方法中声明数组的其余部分: Array3 = [NSMutableArray arrayWithObjects: nil]; 然后我通过调用 ViewDidLoad 方法中的函数来加载数组中的元素,以用元素填充数组。

编辑 2 显示更多我如何填充数组 - (void)viewDidLoad

[super viewDidLoad];
Array3 = [NSMutableArray arrayWithObjects: nil];
 [self loadArray];


- (void) loadArray
//populate array in here.
// I use the add object method
//  [Array3 addobject:object];

【问题讨论】:

您在哪里加载/定义/填充 Array3?您的描述向我表明数据源正在异步填充,并且在您第一次显示视图控制器时还没有准备好。 我在 .m 文件中的实现下面定义它。你知道我该如何解决吗? 我没办法告诉你,因为你没有表现出来。 :-) 该数组如何获取元素? 请检查句子 Im using [table reloadData] to reload the table in the viewDidAppear: method 因为它在 viewDidAppear: 方法中不起作用,在另一种情况下我把它放在按钮操作。,特别是您的 viewDidAppear 评论。 “然后我通过调用 ViewDidLoad 方法中的函数来加载数组中的元素,以用元素填充数组。”这并没有告诉任何人您 如何 加载数组的详细信息(例如它是否是同步的)。显示您在 viewDidLoad 中调用的方法。显示您的 viewDidLoad 方法,以便我们可以看到 在哪里您调用了加载数组的方法。 【参考方案1】:

    好消息第一:你的方法cellForRowAtIndexPath是正确的。

    -viewDidAppear:-viewWillAppear 中都不需要调用reloadData。如果您在视图被覆盖的情况下修改 Array3 的内容,这句话可能不成立,这是一种特殊情况。

这不是你在哪里定义你的方法的问题,而是你在哪里调用它。填充 Array3 内容的合理位置是在

required init(coder aDecoder: NSCoder!)

override func viewDidLoad()

陷阱

此外,您需要所有委托方法(numberOfSectionsInTableViewnumberOfRowsInSectioncellForRowAtIndexPath)根据您的数组返回一致的值。一个简单的技术是使用数组中的条目数来驱动numberOfRowsInSection

何时使用 reloadData?

reloadData 的典型用法如下所示:

- (void)loadArray 
    //populate array in here.
    ...
    [self.tableview reloadData]; // Possibly postpone to main thread

【讨论】:

您能否扩展“所需的初始化(编码器 aDecoder:NSCoder!)?”我以前从未见过这个(我正在使用 Obj-C) 对不起,我试图在 -(void)loadView 方法中填充我的数组,但我无法让它工作。现在,当我将代码放在该方法而不是 ViewDidLoad 中时,表格甚至根本不显示。我也应该在 ViewDidLoad 中做些什么吗? 谢谢!这对我帮助很大,因为我已经解决了我的问题【参考方案2】:

例如你可以给单元格标识符唯一的

NSString *cellIdentifier =[NSString stringWithFormate:@"%d",indexPath.row];

也许这会对你有所帮助...

【讨论】:

【参考方案3】:

我认为Array3 在第一次加载时为零。

【讨论】:

是的,它最初设置为 nil,但我在设置数组后立即用 ViewDidLoad 方法中的对象填充它。我已经编辑了我的帖子以反映这一点【参考方案4】:

我相信在您对Array3 的初始设置中,您必须将此变量分配给内存,然后用于不同的函数,例如tableView:cellForIndexPath:

因此,您可以使用Array3 = [[NSMutableArray alloc] init]; 而不是Array3 = [NSMutableArray arrayWithObjects: nil];

由于您在这行代码中将其保留为空数组,因此您不会使用[[NSMutableArray alloc] initWithObjects: nil];,因为它实际上是相同的交易

【讨论】:

以上是关于UITableView 没有正确重新加载的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 两次重新加载数据,但没有正确显示数据

UITableview 没有重新加载

iOS为啥只有在重新加载UITableView后才能正确显示UIView

UITableView 在 iOS 7.1 上无法正确重新加载

解析查询后在哪里重新加载 UITableView 数据

iOS UITableView在过滤时滚动插入