4

两天以来,我陷入了一个愚蠢的问题。我有一个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 成功调用。但是当我在某个时间后重新加载数据时,除了这个之外,其他方法都被调用了,并且表格消失了,如第二张图片所示。有任何想法吗?

4

7 回答 7

5

您的问题是您可能在后台线程上下载数据内容。由于您无法在后台更新 UI,您需要在下载完成后在主线程上调用 [self.tableView reloadData]!

希望能帮助到你!

于 2013-07-12T06:22:12.020 回答
5

看起来你在辅助线程中,使用以下代码在主线程中执行 reloadData

[self.tableView performSelectorOnMainThread@selector(reloadData) withObject:nil waitUntilDone:NO]

您始终可以使用 [NSThread isMainThread] 来检查您是否在主线程中。

于 2013-07-12T07:09:23.053 回答
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;
于 2013-07-12T05:42:59.807 回答
1

首先,我坚信tableview的实例名称不应该与局部变量相似(即类中的tableView不应该等于委托和数据源方法中的tableView)。

在您发布的第二个问题中,我看不到为表格视图设置的委托。如果您在 .h 或 .m 文件中设置了表视图的 @property,则由 Samir Rathod 发布的答案应该可以工作。

如果您有 XIB 文件,也可以执行此操作。按 ctrl 并单击 + 将 tableview 拖动到文件所有者并设置委托和数据源。

于 2013-07-12T06:20:27.090 回答
1

对我来说,问题是我的存根代码返回 0 作为节数(因此它从未询问该节中有多少行,也从未得到它们的数据)。如果这也是您的问题,只需将其更改为 1。此外,我在 Swift 中工作,@shahid-rasheed 提到的问题的编码(略有)不同:

dispatch_async(dispatch_get_main_queue(), {
    self.tableView.reloadData()
})
于 2014-10-29T14:39:10.527 回答
0

最后我得到了它的工作。cellForRowAtIndexPath没有被调用是因为我在这里没有提到的一行代码......这实际上是从视图中删除了一些颜色背景层。它导致重新加载问题。删除它后,一切正常。

谢谢大家的合作:)

于 2013-07-12T09:38:21.793 回答
0

我也有同样的症状。就我而言,我第一次在 viewDidLoad 中加载数据(来自核心数据)时,使用 NSSortDescriptor 对数据进行排序。

点击一个按钮,核心数据被再次获取(这次有变化)并重新加载了 tableView 数据。单击按钮后,它最初给了我一个空白表格视图,因为我第二次获取数据时忘记对数据进行排序。

学习要点:记得调用所有修改单元格的方法(比如 iAnum 提到的背景颜色,或者在我的例子中是 NSSortDescriptor),如果你一开始就使用它们!

于 2014-06-19T05:29:05.017 回答