の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の冒頭で気付くでしょうUIActivityIndicatorView
。awakeFromNib
、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 は、接続先のオブジェクトが存在しなくても接続できますか? この場合、spinner
IBOutlet を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
これは私が以前に見たかったものです。それにもかかわらず、私はまだアニメーションを取得していません。
私が除外した可能性のある問題:
- スピナーは背景と同じ色で、見えなくなります。私のプロジェクトでは、背景は黒、スピナーは白です。
UIActivityIndicatorView
いくつかの高価なメソッドがメインスレッドをブロックしている間にアニメーション化しようとしています。私のプロジェクトでは、すべてのファイル システム I/O およびダウンロード メソッドが非メインdispatch_async
キューで呼び出されます。- スピナーのIBOutlet が接続されていません。私のプロジェクトでは、これを何度も再確認しました。ストーリーボードと PhotoViewController.h ファイルの両方から、接続されていることがわかります。
これら 3 つの可能性はすべて、ダウンロード プロセス全体で正常にアニメーション化されるという事実によって除外され[self.spinner startAnimating];
ます。viewWillAppear
必要に応じて、このプロジェクトをダウンロードできます。大きな写真を表示しようとする画面に移動すると、スピナーが表示されないことがわかります。このプロジェクトには多くの問題がありますが、これは私が今焦点を当てているものです。
編集1:
- プロジェクトの欠落している依存関係を Git に追加したので、プロジェクトがコンパイルされます
編集 2 (2013 年 2 月 2 日):
- この問題は、
updatePhoto
別のView ControllerprepareForSegue
がFlickrPhotoViewController
. これが問題に寄与している可能性はありますか?