UITableView 没有重新加载

Posted

技术标签:

【中文标题】UITableView 没有重新加载【英文标题】:UITableView is not reloading 【发布时间】:2013-03-29 21:19:16 【问题描述】:

我正在制作一个使用UITableViewUITableViewController 的应用程序。但是,当我在UITableViewController 中调用[self.tableView reloadData]; 时,什么也没有发生(tableView: cellForRowAtIndexPath: 没有被调用)。我该怎么办?

- (void) UserChangedAmmountAndCurrency: (NSNotification*) notification 
    self.localBank.activeAmmount=((NSNumber*)[notification.userInfo objectForKey:@"newAmmount"]).doubleValue;
    self.localBank.activeCurrency=[self.localBank.worldBank requestCurrencyForLocalBank:((NSString*)[notification.userInfo objectForKey:@"newISO4217Currency"])];
    [self.tableView reloadData];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    NSNumber *ammount= [self.localBank ammountForElementAtIndex:indexPath.row];
    VIPCurrency* currency=[self.localBank currencyForElementAtIndex:indexPath.row];


    static NSString *CellIdentifier = @"cellWithCurrencyAndAmmount";
    VIPConversionCell* cell=[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.longCurencyIdentifier.text=currency.longName;
    cell.shortCurrencyIdentifier.text=currency.shortName;
    cell.textfieldForAmmount.text=ammount.stringValue;
    return cell;

编辑: 我做了一些额外的测试。我测试了tableview数据源和delegate是我用来调用reload方法的viewcontroller,没问题。我还注意到其他一些奇怪的事情。调用 reloadData 时,既不会调用 numberOfSectionsInTableView: 也不会调用 numberOfRowsInSection:。我觉得在调用 reloadData 之前我没有做一件基本的事情,但我不知道是什么。难道是我必须以某种方式专门将单元格设置为过期?

编辑:我还检查了该方法是否在主线程中被调用,这也可以

【问题讨论】:

dequeueReusableCellWithIdentifier 返回 nil 时,您的代码无法处理这种情况 ... 我敢打赌,您没有将 tableView:cellForRowAtIndexPath: 的实现者设置为表格视图的数据源。或者您没有分配 tableView 属性。尝试记录 self.tableView。是零吗? 当我使用storyBoards创建表格视图时,是否应该为表格视图设置委托和数据源?此外,数据第一次加载得很好,但是当我更改模型并要求我的 tableview 重新加载时,它不会调用数据源 cellFor ... - 方法。可能是什么问题? Verec,当 dequeueReusableCellWithIdentifier 返回 nill 时,我是否有理由希望从该方法返回其他内容然后 nill?如果是这样的话,我认为无论如何都会有一个错误。在这里处理山丘的情况有什么不同的哲学吗? 我已经使用 Log 函数明确检查过,视图的数据源设置正确,视图本身非常活跃...... :( 【参考方案1】:

.xib 文件和.h 文件(UITableViewDataSource, UITableViewDelegate) 中设置表视图委托

[myTableView reloadData];

【讨论】:

【参考方案2】:

dequeReusableCellWithIdentifier 调用中检查nil 的想法是创建一个新单元格并将其返回。除非您之前使用给定标识符创建了一个单元格并且在可重用池中,否则该方法将返回nil。因此,正如 @Verec 所述,您应该检查 nil 并自己创建单元格和 return

【讨论】:

我创建了带有标识符的单元格作为情节提要中的原型单元格,因此当队列为空时将创建并给出一个新单元格。 不,您不再需要检查 nil。根据 Apple 的说法,您应该使用 dequeueReusableCellWithIdentifier:forIndexPath: 而不是 dequeueReusableCellWithIdentifier:,但我注意到这似乎并不重要。只要您在情节提要中制作单元格,并且具有正确的标识符,它就应该可以工作。此外,OP 说第一次加载表格很好。 如果你已经注册了一个nib带有可复用的标识符,在ios5+中UITableView会自动为你创建一个有效的cell,如果队列中没有可复用的cell;因此指针永远不会是nil,你不需要处理它。【参考方案3】:

你只需要添加

UITableViewDataSource,UITableViewDelegate

在.h中

例子

@interface yourviewcontroller : UIViewController <UITableViewDataSource,UITableViewDelegate>

【讨论】:

仅仅声明符合协议不会有任何影响;它仅意味着控制器可以是表视图数据源/委托。提问者还必须将此控制器设置为相关表格视图的数据源和委托。

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

UITableview 没有重新加载

UITableView 没有重新加载

UITableView 没有正确重新加载

SwiftyJSON 没有重新加载 UITableView

UITableView 没有在 reloadData 上重新加载

为啥我的函数没有重新加载 UITableView 的数据?