4

我有一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如果存在,您会在我打印一条消息的开头注意到UIActivityIndicatorViewawakeFromNib我在、viewDidLoad和中放置了类似的声明viewWillAppear。当我运行它时,这是我得到的确切输出:

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 可以在它连接的对象不存在的情况下连接吗?在这种情况下, IBOutlet 是否可以在不分配的情况下spinner连接到情节提要?spinner

除此之外,我覆盖了 getterspinner以便它在不存在时实例化。结果,打印输出现在如下所示:

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

这是我之前期望看到的。尽管如此,我仍然没有得到任何动画。

我已经排除的可能问题:

  • 微调器与背景颜色相同,使其不可见。在我的项目中,背景是黑色的,微调器是白色的。
  • 我正在尝试制作动画,UIActivityIndicatorView 而一些昂贵的方法正在阻塞主线程。在我的项目中,我所有的文件系统 I/O 和下载方法都在非主dispatch_async队列中调用。
  • 微调器的IBOutlet 未连接。在我的项目中,我已经多次检查了这一点。从情节提要和 PhotoViewController.h 文件都可以看出它是连接的。

所有这三种可能性都被排除在外,因为它可以在整个下载过程中成功地制作动画[self.spinner startAnimating];viewWillAppear

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

编辑1:

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

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

  • updatePhoto由于另一个视图控制器将prepareForSegue照片设置在FlickrPhotoViewController. 这可能会导致问题吗?
4

1 回答 1

1

在你调用 updatePoto 方法之前尝试启动 uiactivityindictor 动画,Tru 调用这个 i 而不是全部调用 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
                }
            });
        });
    }

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

于 2013-01-31T17:52:09.980 回答