2

我创建了一个类来生成票证,当票证生成时,我想在表格视图中一一显示。我为该类创建了一个协议,一旦准备好票证,我就会向其代表发送一条消息,tableView以重新加载表格视图。当reload调用该方法 时,tableView - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section每次生成新票时都会调用该方法,但 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath每次生成票时都不会调用该方法,但是一旦生成了所有票,它就会被调用

下面是代码

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (self.ticketGenerator == nil) {
        return 0;
    }
    else{
        return self.ticketGenerator.ticketNumbers.count;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    HSEticketView *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[HSEticketView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        [cell Tickets:[self.ticketGenerator.ticketNumbers objectAtIndex:indexPath.row]];
    }

    // Configure the cell...

    return cell;
}

//to increase the height of the cell

- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 135;
}

-(void)background
{
    [self.ticketGenerator GenerateNoOfTickets:[self.enteredNo.text intValue]:self];
}


- (IBAction)done:(id)sender {
    [self.enteredNo resignFirstResponder];
    self.enteredNo.hidden = YES;
    self.label.hidden = YES;
    self.button.hidden = YES;
    self.tableView.hidden = NO;

    [self performSelectorInBackground:@selector(background) withObject:nil];
        NSLog(@"dgf");

}

#pragma ticketGenrate delgate methods

-(void)generationOfTicketCompleated
{
    [self.tableView reloadData];


}
4

3 回答 3

1

对 UI 的所有更改都必须在主线程上完成。如果你执行

[self.ticketGenerator GenerateNoOfTickets:...]

在后台线程上,并且(如我所料)函数调用

[tableView insertRowsAtIndexPaths:...]

那是行不通的,因为insertRowsAtIndexPaths必须在主线程上调用。

如果你想从后台线程更新表格视图,你可以例如做

dispatch_async(dispatch_get_main_queue(), ^{
    add item to data source array ...;
    [tableView insertRowsAtIndexPaths:...];
});
于 2012-10-04T11:17:48.567 回答
0

检查您的返回 self.ticketGenerator.ticketNumbers.count;为 0 则 cellForRowAtIndexPath 不会像 [reload YourTableViewName] 一样调用或重新加载 ViewWillAppear 中的 tableview。

于 2012-10-04T11:10:23.370 回答
0

谢谢你马丁

问题是我正在另一个线程上执行 [tableView reloadData],因为 uielements 需要在主线程上运行该方法

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

没有被称为我得到的解决方案是

-(void)generationOfTicketCompleated
{
    dispatch_async(dispatch_get_main_queue(), ^{

        [self.tableView reloadData];
    });

}
于 2012-10-04T13:07:16.180 回答