【问题标题】:UIActivity Indicator not showing up on ios app launchUIActivity 指示器未在 ios 应用启动时显示
【发布时间】:2013-01-17 21:12:29
【问题描述】:

我正在尝试在 iOS 中使用活动指示器但无法使用。我在 Stackoverflow 上关注了一个线程并像这样使用它。这是我写的:

-(void)viewDidLoad
{
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:self];

    UITapGestureRecognizer *tGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doThisForTap:)];
    tGR.numberOfTapsRequired = 1;

    [myRollTypeLabel addGestureRecognizer:tGR];
    myRollTypeLabel.userInteractionEnabled = YES;

    [self.scrollView addSubview:myRollTypeLabel];
}

- (void) threadStartAnimating:(id)data
 {
self.activityIndicatorNew =[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
self.activityIndicatorNew.color = [UIColor redColor];
[self.activityIndicatorNew startAnimating];
 }
- (void)doThisForTap :(UIGestureRecognizer *)gest
{
  //lots of computation.
}
- (void)viewWillDisappear:(BOOL)animated
{
[self.activityIndicatorNew stopAnimating];
self.activityIndicatorNew.hidden = YES;
}

但活动指示器根本不显示?在“doThisForTap”方法中,我进行计算并移动到另一个 UIViewController。但我看不到活动指示器。我究竟做错了什么?如果您需要更多信息,请询问。谢谢..

【问题讨论】:

  • 我认为 NSThread 不能在 UIKit 中使用(非线程安全)。
  • @Larme。这是我在我的问题stackoverflow.com/questions/1850186/… 中提到的线程
  • 好吧,我会在主线程中做动画,如果它不接触 UI,那么加载或你想要同时在另一个线程中做的任何事情。您有时可以“重新同步”以在最终结束和步骤之间制作一个小动画。
  • @Larme 正确。他不应该做他正在做的事情。

标签: ios animation nsthread uiactivityindicatorview


【解决方案1】:

看起来好像您实际上是在使用 addSubview 将指示器添加到视图层次结构中:

你正在实例化它,将它分配给一个属性,并开始它的动画,但从未真正将它添加到视图层次结构中(据我所知)。

要将活动指示器添加到屏幕中,您应该设置它的原点,然后将其添加到它应该出现的任何视图中:

self.activityIndicatorNew =[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
self.activityIndicatorNew.color = [UIColor redColor];

CGRect indicatorFrame = self.activityIndicatorNew.frame;
indicatorFrame.origin.x = // x coordinate goes here;
indicatorFrame.origin.y = // y coordinate goes here;
self.activityIndicatorNew.frame = indicatorFrame;

[self.view addSubview:self.activityIndicatorNew];

[self.activityIndicatorNew startAnimating];

您不应该在后台线程中执行上述大部分操作,因为您不应该从除主线程之外的任何东西操作视图层次结构。

如果您确实需要在后台线程中启动指示器动画(不完全相信您从显示的代码中这样做),那么在该后台线程中唯一安全的做法就是调用 startAnimating .在分离新线程之前,其他所有内容都应该进入 viewDidLoad。

但是,我会先尝试在 viewDidLoad 中完成所有操作,并且仅在绝对必要时使用后台线程。

就我个人而言,我会为此使用 Interface Builder;我想不出很多理由在代码中实例化一个简单的活动指示器。

【讨论】:

  • 谢谢.. 我刚刚放弃了我正在做的一切。刚刚在我的故事板上放了一个 UIActivityIndi​​cator 并从那里开始。它有效..我昨天做了这个..它不起作用..再次感谢。
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多