UIActivityIndi​​catorView从不动画

时间:2013-01-31 17:17:17

标签: ios objective-c uiviewcontroller lifecycle cs193p

我有一个PhotoViewController课程,其中@property UIActivityIndicatorView* spinnerFlickrPhotoViewControllerPhotoViewController的子类,它从Flickr下载照片并告诉微调器何时开始和停止动画。每次为视图控制器提供Flickr照片时,都会调用“updatePhoto”:

- (void)updatePhoto { // Download photo and set it
    NSLog("updatePhoto called");
    if (self.spinner) NSLog(@"Spinner exists in updatePhoto");
    dispatch_queue_t downloadQueue = dispatch_queue_create("downloader",
                                                           NULL);
    [self.spinner startAnimating];

    dispatch_async(downloadQueue, ^{
        // Download the photo
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.spinner stopAnimating];
            // Set the photo in the UI
            }
        });
    });
}

上面的方法正是我用来在桌面视图控制器中显示旋转轮的同时桌面内容下载,它始终在那里工作。

您会注意到updatePhoto的开头,如果UIActivityIndicatorView存在,我会打印一条消息。我在awakeFromNibviewDidLoadviewWillAppear中添加了类似的声明。当我运行它时,这是我得到的确切输出:

2013-01-31 21:30:55.211 FlickrExplorer[1878:c07] updatePhoto called
2013-01-31 21:30:55.222 FlickrExplorer[1878:c07] Spinner exists in viewDidLoad
2013-01-31 21:30:55.223 FlickrExplorer[1878:c07] Spinner exists in viewWillAppear

为什么spinner中不存在awakeFromNib?文档表明“当一个对象收到一个awakeFromNib消息时,它保证已经建立了所有的插座和动作连接。” IBOutlet可以连接而不存在它连接的对象吗?在这种情况下,spinner IBOutlet是否可以在未分配spinner的情况下连接到情节提要板?

除此之外,我覆盖了spinner的getter,以便在它不存在时进行实例化。结果,打印输出现在看起来像这样:

2013-01-31 21:48:45.646 FlickrExplorer[2222:c07] Spinner exists in awakeFromNib
2013-01-31 21:48:45.647 FlickrExplorer[2222:c07] updatePhoto called
2013-01-31 21:48:45.647 FlickrExplorer[2222:c07] Spinner exists in updatePhoto
2013-01-31 21:48:45.649 FlickrExplorer[2222:c07] Spinner exists in viewDidLoad
2013-01-31 21:48:45.650 FlickrExplorer[2222:c07] Spinner exists in viewWillAppear

这是我原本期望看到的。不过,我仍然没有得到任何动画。

我排除了可能出现的问题:

[self.spinner startAnimating];放入viewWillAppear使整个下载过程成功动画,这三种可能性都被排除了。

如果您愿意,可以下载this project。只需转到任何试图显示大照片的屏幕,您就会看到微调器没有出现。这个项目有很多问题,但这是我现在关注的问题。

编辑1:

  • 我在Git上添加了项目缺少的依赖项,因此项目将会 现在为你编译

编辑2(2013年2月2日):

  • 由于另一个视图控制器updatePhotoprepareForSegue中设置了照片,因此我在调用FlickrPhotoViewController方法时仅在iPhone上看到此问题。这有可能导致问题吗?

1 个答案:

答案 0 :(得分:1)

尝试在调用像这样的updatePoto方法之前启动uiactivityindictor的动画 Tru称之为完全调用UpdatePhoto的所有内容:

[self startAnimatingAndThenUpdatePhoto];


-(void)startAnimatingAndThenUpdatePhoto{
 if (self.spinner) NSLog(@"Spinner exists in updatePhoto");
  [self.spinner startAnimating];
 [self performSelector:@selector(updatePhoto) withObject:nil afterDelay:0.01];
}
 - (void)updatePhoto { // Download photo and set it
        NSLog("updatePhoto called");
        dispatch_queue_t downloadQueue = dispatch_queue_create("downloader",
                                                               NULL);

        dispatch_async(downloadQueue, ^{
            // Download the photo
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.spinner stopAnimating];
                // Set the photo in the UI
                }
            });
        });
    }

这不是世界上最好的方法,但它会做好工作