2014-07-05 60 views
0

我正在使用web服务来填充项目的数组,然后用于填充我的表格视图的单元格。viewDidLoad之前的延迟表视图加载或加载数组?

现在我遇到了表视图本身的问题。当我检查“numberofrows”方法时,数组尚未加载。出于某种原因,它加载了“之后”(根据我的nslogs &断点),尽管我已经尽可能早地将每种加载方法都放在该控制器中。

现在是什么我不知道的是:

  • 有延迟表视图的创建,所以我敢肯定,我的数组被加载的方法吗?
  • 有没有办法加载我的数组?它目前是我在viewDidLoad中的第一行。 (调用另一个类,然后调用Web服务并返回一个数组,但到那时,表视图已经加载并且为空)。

我试过了:把tableview reloadData。但它根本不起作用。出于某种原因,编译器会读取该行,但不会加载任何新内容,即使此时阵列已满。

我错过了什么?

我可以编辑和添加一些代码,你们会要求(我的tableview,如果我把我的阵列硬编码的对象只是罚款),但因为这看起来像一个学校的问题就在这里,也许我只是忘了一些东西。

伙计们,我是所有的耳朵! 编辑:

我的不同方法;我已经删除了不必要的代码,以便更清晰地阅读。 编译器从不进入cellForRow,因为numberOfRows返回一个零数字。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"CustomCellTableViewCell"; 
    CustomCellTableViewCell *cell = [self.tbUpcomingEvents dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 


    cell.lbTitle = [_eventList objectAtIndex:indexPath.row]; 

    return cell; 
} 

行数; nslog返回零。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"numOfRows : %i", [_eventList count]); 
    return [_eventList count]; 
} 

我的webservice方法,这是从“webservice类”加载数据的方法calle。 在这里,NSLog显示了一个完整的数组。

- (void)loadData:(NSMutableArray*)arrayEvent 
{ 
//arrayEvent is full from the internet data. eventList is also full on the NSLog. 
    _eventList = arrayEvent; 
    NSLog(@"LoadData : %i", [_eventList count]); 
    [self.tbUpcomingEvents reloadData]; 
} 

我viewDidLoad方法

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Calling my UseCaseController to load the data from the internet. 
    UCC *sharedUCC = [UCC sharedUCC]; 
    [sharedUCC getUserEventsInDbDis:self :_user]; 

} 
+1

请出示调用重载的tableview,numberOfRowsInSection,numberOfSections和cellForRow方法以及 –

+0

我已经按照你的要求编辑的代码! numberOfSections只是默认值1,所以我没有办法。 –

+0

加载数据和numberOfRows中的断点。 numberOfRows在loadData之后被调用吗?在加载数据中注销'self.tbUpcomingEvent'以确保它不为零。注销'self.tbUpcomingEvents.delegate'以确保它也被设置。 –

回答

0

正如你说你正在使用web服务。所以它在块中执行你的代码,这意味着它在单独的线程中运行。现在按照苹果文档UI更新应该发生在主线程中。因此,对于表的创建你需要包括以下GCD代码相同的: -

dispatch_async(dispatch_get_main_queue,()^{ 

    // write your code for table creation here 
    }); 
+0

尽管这个答案可能是正确的,但是不要刚吐出答案,直到你知道这是一个答案。许多其他的东西可能是错误的。我们不应该随意猜测的解决办法,但需要时间确保我们了解问题。 –

+0

我从来没有使用过这样的代码,但是你的代码看起来非常简单。我只需要明白这一点就可以尝试一下:什么是GCD代码? –

+0

Grand Central Dispatch是我相信NSThread的包装。它用于线程操作。大多数API调用都是在后台线程上完成的。上面的方法将确保块中的操作在主线程上运行。许多UI操作必须在主线程上完成。 –