将UIActivityIndi​​cator添加到UITableView

我需要在表视图中加载一些数据,而这是在后台进行我想添加一个活动指示器,以显示有一个进程正在进行,并会隐藏一旦进程完成。 什么是最有效的方式来实现这样的事情?

取决于你是否想要阻止你的用户,以及活动指示的重要性。

如果你不想阻止用户,使用Application.networkActivityIndicatorVisible ,如果你想有更大的活动指标,而不是阻止用户,animationUIView文本和UIActivityIndi​​cator下面的表视图( tableview.height -= activityview.height )然后隐藏完成或如果你想阻止用户,使用阻止活动指标。

你可以添加一个包含UIIndicatorView和UILabel的视图作为你的单元格的子视图。 你可以用这种方式显示错误数据加载/错误networking/空数据…

例:

你的控制器可以定义两种模式:UITableViewModeMessage和UITableViewModeData。

在viewDidLoad中,你设置了self.tableViewMode = UITableViewModeMessage。 当返回数据时,设置self.tableViewMode = UITableViewModeData并为tableview重新加载数据。

一些代码:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (self.tableViewMode == UITableViewModeMessage) { return 2; } else { return self.yourEntries ? self.yourEntries.count : 0; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.tableViewMode == UITableViewModeMessage) { return [self tableView:tableView messageCellForRowAtIndexPath:indexPath]; } else { return [self tableView:tableView dataCellForRowAtIndexPath:indexPath]; } } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { // Remove Loading... progress view if exist. UIView *progressView = [cell viewWithTag:100]; [progressView removeFromSuperview]; if (self.tableViewMode == UITableViewModeMessage) { if (indexPath.row == 1) { // remove the current label. cell.textLabel.text = nil; // We build progress view and attach to cell here but not in cellForRowAtIndexPath is because in this method cell frame is already calculated. UIView *progressView = [self progressViewForCell:cell message:@"Loading..." alpha:0.9]; [cell addSubview:progressView]; } } } // cell to display when loading - (UITableViewCell *)tableView:(UITableView *)tableView messageCellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"MessageCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.textLabel.textColor = [UIColor grayColor]; cell.textLabel.textAlignment = UITextAlignmentCenter; } if (indexPath.row == 1) { cell.textLabel.text = @"Loading..."; } else { cell.textLabel.text = nil; } return cell; } // cell to display when has data - (UITableViewCell *)tableView:(UITableView *)tableView dataCellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"DataCell"; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } cell.textLabel.text = [[self.yourEntries objectAtIndex:indexPath.row] description]; return cell; } // Build a view which has a UIActivityIndicatorView and a UILabel - (UIView *)progressViewForCell:(UITableViewCell *)cell message:(NSString *)message alpha:(CGFloat)alpha { // NOTE: progressView needs to be removed from cell in cellForRowAtIndexPath: CGRect progressViewFrame = CGRectZero; progressViewFrame.size.width = CGRectGetMaxX(cell.bounds); progressViewFrame.size.height = CGRectGetMaxY(cell.bounds) - 2; UIView *progressView = [[UIView alloc] initWithFrame:progressViewFrame]; progressView.backgroundColor = RGBA(255, 255, 255, 1); progressView.alpha = alpha; progressView.tag = 100; UILabel *loadingLabel = [[UILabel alloc] initWithFrame:progressView.bounds]; loadingLabel.backgroundColor = [UIColor clearColor]; loadingLabel.font = [UIFont systemFontOfSize:14]; loadingLabel.textColor = [UIColor blackColor]; loadingLabel.textAlignment = UITextAlignmentCenter; loadingLabel.text = message; CGFloat widthOfText = [loadingLabel.text sizeWithFont:loadingLabel.font].width; CGFloat spaceBetweenIndicatorAndLabel = 5; // activityIndicatorView has size in which width and height is equal to 20. UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [activityIndicatorView setCenter:CGPointMake(CGRectGetMidX(cell.bounds) - (widthOfText / 2) - (activityIndicatorView.bounds.size.width / 2) - spaceBetweenIndicatorAndLabel, CGRectGetMidY(cell.bounds))]; [activityIndicatorView setColor:[UIColor blackColor]]; [activityIndicatorView startAnimating]; [progressView addSubview:activityIndicatorView]; [progressView addSubview:loadingLabel]; return progressView; }