两天以后,我陷入了一个愚蠢的问题。我UITableViewController
推了Navigation Controller
。加载时,由于没有数据,因此可以看到空表:
但是当我从服务器接收数据并调用[self.tableView reloadData]
时,numberOfRowsInSection
和heightForRowAtIndexPath
都会被调用,除了cellForRowAtIndexPath
,我的控制器显示为没有表:
我无法理解为什么会这样。除cellForRowAtIndexPath
外,调用所有数据源方法。请有人指导我...谢谢..
ActLogController.h
@interface ActLogController : UITableViewController<ASIHTTPRequestDelegate,UITableViewDataSource,UITableViewDelegate>
@property(strong) NSMutableArray *activityKeys;
@end
ActLogController.m
- (void)viewDidLoad
{
[super viewDidLoad];
activityKeys = [[NSMutableArray alloc] init];
self.tableView.dataSource = self;
}
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self retrieveActivityLogFromServer];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return activityKeys.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
ActivityLogUnit *act = [activityKeys objectAtIndex:indexPath.row];
cell.textLabel.text = act.price;
return cell;
}
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 50.0;
}
-(void) requestFinished:(ASIHTTPRequest *)request
{
NSArray *list = [request.responseString JSONValue];
for (int i = 0; i < list.count; i++) {
NSArray *singleTrade = [[list objectAtIndex:i] JSONValue];
ActivityLogUnit *unit = [[ActivityLogUnit alloc] init];
unit.symbol = [singleTrade objectAtIndex:0];
unit.type = [singleTrade objectAtIndex:1];
unit.price = [singleTrade objectAtIndex:2];
unit.volTraded = [singleTrade objectAtIndex:3];
unit.remVol = [singleTrade objectAtIndex:4];
unit.actualVol = [singleTrade objectAtIndex:5];
unit.recordID = [singleTrade objectAtIndex:6];
unit.orderNo = [singleTrade objectAtIndex:7];
unit.time = [singleTrade objectAtIndex:8];
[activityKeys addObject:unit];
}
if(activityKeys.count > 0)
{
[self.tableView reloadData];//it is called and I have got 6 items confirm
}
}
修改
我在数组activityKeys
中设置了一些虚拟数据,数据显示在表格中,cellforrowatindexpath
成功调用。但是当我在一段时间后重新加载数据时,会调用其他方法,除了这一个,表格消失,如第二张图所示。有什么想法吗?
答案 0 :(得分:5)
您的问题是您可能在后台线程上下载数据内容。由于无法在后台更新UI,因此下载完成后需要在主线程上调用[self.tableView reloadData]!
希望它有所帮助!
答案 1 :(得分:5)
看起来你在辅助线程中,使用以下代码在主线程中执行reloadData
[self.tableView performSelectorOnMainThread@selector(reloadData) withObject:nil waitUntilDone:NO]
您可以随时使用[NSThread isMainThread]来检查您是否在主线程中。
答案 2 :(得分:4)
你必须写入viewdidload
self.tableView.dataSource = self;
self.tableView.delegate = self;
修改强>
您没有xib然后声明/设置tableview的属性。像
self.tableView.frame = CGRectMake(0, 45, 320, 500);
self.tableView.rowHeight = 34.0f;
self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
[self.view addSubview:self.tableView];
[self.tableView setBackgroundColor:[UIColor clearColor]];
self.tableView.showsVerticalScrollIndicator=NO;
self.tableView.dataSource = self;
self.tableView.delegate = self;
尝试
@property(nonatomic,strong) NSMutableArray *activityKeys;
答案 3 :(得分:1)
首先,我强烈认为tableview的实例名称不应该与局部变量类似(即类中的tableView不应该等于委托和数据源方法中的tableView)。
发布的问题中的第二个我无法看到表格视图的委托集。 答案发布者Samir Rathod应该可以工作,如果您在.h或.m文件中设置了表格视图的@property。
如果您有XIB文件,也可以执行此操作。 按ctrl并单击+将tableview拖动到文件所有者并设置委托和数据源。
答案 4 :(得分:1)
对我来说,问题是我的存根代码返回0作为节的数量(因此它从未询问该节中有多少行,并且从未得到他们的数据)。如果这也是你的问题,只需将其更改为1即可。另外,我在Swift工作,@ shahid-rasheed提到的问题编码(略有)不同:
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
答案 5 :(得分:0)
最后我得到了它。因为我在这里没有提到的一行代码而没有调用cellForRowAtIndexPath
...这实际上是从视图中删除了一些颜色背景层。这导致了重装问题。删除后,一切正常。
谢谢大家的合作:)
答案 6 :(得分:0)
我也有同样的症状。在我的例子中,我第一次在viewDidLoad中加载数据(来自核心数据),NSSortDescriptor用于对数据进行排序。
单击按钮,再次获取核心数据(这次更改)并重新加载tableView数据。单击按钮后,它最初给了我一个空白的表格视图,因为我第二次拿到它时忘了对数据进行排序。
学习要点:如果你在开始使用它们,请记住调用所有修改单元格的方法(如iAnum提到的背景颜色,或者我的情况下为NSSortDescriptor)!