2

チケットを生成するクラスを作成しました。チケットが生成されたら、それをテーブル ビューに 1 つずつ表示します。そのクラスのプロトコルを作成し、チケットの準備ができたら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

ありがとうマーティン

問題は、uielementsをメインスレッドで実行する必要があるため、別のスレッドで[tableViewreloadData]を実行していることです。

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

私が得た解決策とは呼ばれていません

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

        [self.tableView reloadData];
    });

}
于 2012-10-04T13:07:16.180 に答える
0

返品を確認してくださいself.ticketGenerator.ticketNumbers.count; が0の場合、cellForRowAtIndexPathは、[reloadYourTableViewName]のようにViewWillAppearでテーブルビューを呼び出したりリロードしたりしません。

于 2012-10-04T11:10:23.370 に答える