【问题标题】:Cannot get UIActivityIndicatorView to show while loading data加载数据时无法显示 UIActivityIndi​​catorView
【发布时间】:2012-07-19 04:26:56
【问题描述】:

我在 TableViewController 上有一个 UIActivityIndi​​catorView。当我在 init 中开始制作动画时,我会看到活动指示器,但是当我将 start 命令移动到其他任何地方时,它将无法工作/显示。有谁知道我做错了什么,我似乎无法在这里找到它。我希望它在我加载数据时显示。

TableViewController.h

#import <UIKit/UIKit.h>


@interface CategoryTableViewController : UITableViewController {
    NSArray *cats;
    UIActivityIndicatorView *activityIndicator;
}

@end

TableViewController.m

#import "CategoryTableViewController.h"
#import "NieuwsDataManager.h"
#import "CategoryTableCell.h"
#import "NiewsCategory.h"
#import "NieuwsTableViewController.h"


@implementation CategoryTableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        cats = [[NSArray alloc ] initWithArray:[NieuwsDataManager sharedInstance].newsCategories];
        self.title = @"Nieuws" ;
        activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(100,150,120,120)];
        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;


        [self.view addSubview:activityIndicator];


    }
    return self;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    [activityIndicator startAnimating];



    NiewsCategory *cat = [[NieuwsDataManager sharedInstance].newsData objectForKey:[cats objectAtIndex:indexPath.row]];



    [[NieuwsDataManager sharedInstance] getNewsByCategory:cat];



    NieuwsTableViewController *nt = [[NieuwsTableViewController alloc] initWithCategory:cat];

    [activityIndicator stopAnimating];

    [self.navigationController pushViewController:nt animated:YES];

    [nt release];

    [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
}

【问题讨论】:

    标签: iphone ios uiactivityindicatorview


    【解决方案1】:
    [self.view addSubview:activityIndicator];
    

    从这段代码中,我认为tableView 的设置可能不如self.view。您正在将其添加到 view 中,因此您的方法 [activityIndicator startAnimating]; 可能确实有效,但您必须将其设置为“将子视图置于前面”。它可能是在 tableview 下进行动画处理的。

    【讨论】:

    • 这似乎不是问题,我从它正常显示的init函数调用startAnimating的那一刻。
    【解决方案2】:

    我会这样做:

    - (id)initWithStyle:(UITableViewStyle)style {
      //your code
      [self.view addSubview:activityIndicator];
      [activityIndicator startAnimating];
    }
    
    - (void)viewDidAppear:(BOOL)animated {
      [super viewDidLoad];
      [activityIndicator stopAnimating];
    }
    

    我找到了一个关于这个的教程,它展示了一个非常好的方法: http://www.markbetz.net/2010/09/30/ios-diary-showing-an-activity-spinner-over-a-uitableview/

    【讨论】:

      【解决方案3】:

      过去我注意到 UIActivityIndi​​cators 会在 UI 线程挂起时进行绘制,但您可能需要在后台线程中执行任务,以便 UI 线程为进度指示器设置动画。见Apple's documentation about Concurrency Programming。一般来说,最好在后台线程上执行冗长的操作,以便 UI 线程可以保持对用户的响应。

      【讨论】:

        【解决方案4】:

        self.view 是否已经在 init 方法中可用?这种操作不应该在viewDidLoad方法中执行吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多