【问题标题】:What is a good concept to implement activity indicator什么是实施活动指标的好概念
【发布时间】:2014-03-03 21:45:38
【问题描述】:

在我们的 iPgone 和 iPad 应用程序中,我们在不同的 ui 控制器之间使用 push segue 转换,其中大多数扩展了 UICollectionViewController。在每个控制器中,我们从内部 API 加载数据。加载完成 viewWillAppearviewDidLoad
现在,问题是,这个 API 调用有时可能需要一两秒钟,甚至三秒钟......好吧,那里有很多东西,假设我们无法更改它。但是,我们可以改变用户体验,至少添加“加载”圆圈指示器。问题是,我无法通过正确的概念理解,当从 A 过渡到 B 时,“加载”是在 B 完成的,而页面 A 仍然存在。 所以,问题是“如何在页面 A 上显示指示器,同时为页面 B 加载控制器?”

谢谢大家,
乌里。

【问题讨论】:

  • 好吧,您可以简单地在viewDidLoad 中进行API 调用,然后在要在后台线程上呈现的视图控制器上调用loadView,仅在下载完成后推送segue。您对这种方法有疑问吗?
  • @David 我认为差别不大。如果我按下一个启动 segue 的按钮但没有任何反应,我会认为出了点问题
  • @user2759361 显然,OP 应该在后台加载数据时显示活动指示器;)
  • @David - 不确定我是否理解如何实现这一点。从 A 实例化控制器 B?但是如何告诉performSegue控制器B准备好了呢?
  • @urir 您使用什么网络 API 来加载数据?在 AFNetworking 的情况下,您可以传递将在下载完成时执行的块。您可以使用此块告诉A B 已完成加载。类似的事情可以通过NSURLConnection 中的委托协议来实现。

标签: ios iphone ipad uicollectionview uiactivityindicatorview


【解决方案1】:

在这种情况下,常见的方法是在目标视图控制器中加载数据,而不是在主线程中。您可以在后台线程中加载数据时显示指示器,然后将其删除。

这是我的项目中解决相同问题的代码示例:

- (void) viewDidLoad {
    ...
    // add indicator
    self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    self.spinner.hidesWhenStopped = YES;
    self.spinner.center = self.view.center;
    [self.view addSubview:self.spinner];

    ...    
    // fetch news
    [self.spinner startAnimating];
     __weak typeof(self) weakSelf = self
    [[BitrixApiClient sharedInstance] getLatestNewsWithCompletionBlock:^(NSArray *newsArray, NSUInteger maxPageCount, NSUInteger currentPageNumber, NSError *error) {
        if (!error) {
            weakSelf.newsArray = newsArray;
            weakSelf.currentPageNumber = currentPageNumber;

            [weakSelf.newsTableView reloadData];
        }
        // stop spinning
        [weakSelf.spinner stopAnimating];
    }];
}

【讨论】:

  • 我分别在每个控制器中加载数据。您能否解释一下如何“显示指标背景线程”?您的意思是在视图 A 上显示指标?但是离开 B 后如何“清理”它?
  • 我看到更新的例子,我想我明白了,让我试试吧!
  • 我想提一下,在块中使用指向 self 的弱指针会很有用。因为用户可以从当前视图控制器返回。在 [BitrixApiClient sharedInstance] 之前创建 @987654323 会很有用@ and thein 在完成块的主体中​​ [weakSelf.newsArray = ...;, [weakSelf.spinner stopAnimating];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2012-06-06
  • 2010-11-24
相关资源
最近更新 更多