2012-07-31 63 views

回答

1

取决于是否要阻止您的用户或不还怎么重要的是活动指示。

如果你不想阻止用户使用Application.networkActivityIndicatorVisible,如果你想有更大的活动指标,但仍不能阻止用户使用文本和UIActivityIndi​​cator表视图(tableview.height -= activityview.height)以下动画的UIView,然后隐藏完整或者如果您想阻止用户,请使用阻止活动指示器。

+0

我想肯定这些链接。感谢您向我展示这些。 – 2012-07-31 20:55:11

+0

顺便说一句,你是如何将MBProgressHud项目添加到你的应用程序?每次我尝试编译时,都会收到编译错误。 – 2012-07-31 21:33:50

+0

什么样的编译错误?如果您使用的是ARC,则必须禁用ARC for MBProgressHUD('Target'>'Build Phases'>'Compile Sources'>'MBProgressHUD.m' set compiler flag'-fno-objc-arc') – 2012-07-31 21:37:10

0

您可以添加具有UIIndicatorView和一个UILabel作为您单元的子视图的视图。你可以用这种方式来显示错误数据加载/错误的网络/空数据...

例子:

控制器可以定义两种模式: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; 
}