我创建了一个生成故障单的类,当生成故障单时,我想逐个在表视图中显示它。
我已经为该类创建了一个协议,一旦准备好故障单,我就会向其委托发送一条消息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];
}
答案 0 :(得分:1)
必须在主线程上完成对UI的所有更改。如果你执行
[self.ticketGenerator GenerateNoOfTickets:...]
在后台线程和(假设)函数调用
[tableView insertRowsAtIndexPaths:...]
不起作用,因为必须在主线程上调用insertRowsAtIndexPaths
。
如果要从后台线程更新表视图,可以执行
dispatch_async(dispatch_get_main_queue(), ^{
add item to data source array ...;
[tableView insertRowsAtIndexPaths:...];
});
答案 1 :(得分:0)
检查你的返回self.ticketGenerator.ticketNumbers.count;是0然后cellForRowAtIndexPath没有调用或重新加载ViewWillAppear中的tableview,如[reload YourTableViewName]。
答案 2 :(得分:0)
谢谢你马丁
问题是我正在另一个线程上执行[tableView reloadData],因为uielements需要在主线程上运行方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
没有被称为我得到的解决方案
-(void)generationOfTicketCompleated
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}