4

PhotoViewControllerクラスがあり@property UIActivityIndicatorView* spinnerます。 Flickr から写真をダウンロードし、スピナーにアニメーションの開始と停止のタイミングを伝える のFlickrPhotoViewControllerサブクラスです。PhotoViewControllerビュー コントローラに 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が存在する場合、I print a messageの冒頭で気付くでしょうUIActivityIndicatorViewawakeFromNibviewDidLoad、 にも同様のステートメントを入れました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 は、接続先のオブジェクトが存在しなくても接続できますか? この場合、spinnerIBOutlet をspinner割り当てずにストーリーボードに接続できますか?

これを超えて、ゲッターがspinner存在しない場合にインスタンス化されるように、ゲッターをオーバーライドしました。その結果、印刷​​出力は次のようになります。

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

これは私が以前に見たかったものです。それにもかかわらず、私はまだアニメーションを取得していません。

私が除外した可能性のある問題:

これら 3 つの可能性はすべて、ダウンロード プロセス全体で正常にアニメーション化されるという事実によって除外され[self.spinner startAnimating];ます。viewWillAppear

必要に応じて、このプロジェクトをダウンロードできます。大きな写真を表示しようとする画面に移動すると、スピナーが表示されないことがわかります。このプロジェクトには多くの問題がありますが、これは私が今焦点を当てているものです。

編集1:

  • プロジェクトの欠落している依存関係を Git に追加したので、プロジェクトがコンパイルされます

編集 2 (2013 年 2 月 2 日):

  • この問題は、updatePhoto別のView ControllerprepareForSegueFlickrPhotoViewController. これが問題に寄与している可能性はありますか?
4

1 に答える 1

1

UpdatePhoto をすべて呼び出す代わりに、この iTru を呼び出して、このように updatePoto メソッドを呼び出す前に、uiactivityindictor のアニメーション化を開始してみてください。

[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 に答える