UITableView 没有重新加载
Posted
技术标签:
【中文标题】UITableView 没有重新加载【英文标题】:UITableView is not reloading 【发布时间】:2013-03-29 21:19:16 【问题描述】:我正在制作一个使用UITableView
和UITableViewController
的应用程序。但是,当我在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 没有重新加载的主要内容,如果未能解决你的问题,请参考以下文章