2011-07-05 11 views
1

私がiPadアプリでページを切り替えると、次のコードを使用してページ番号を表示しています。この数字は、透明な灰色のペインに表示されるはずです(XCodeの "Build Succeeded"メッセージに似ています)。ただし、画像ビューは約5%の時間しか表示されません。 (まだペインに数字を入れるコードは追加していません)。毎回NSLog()というメッセージが表示されます。私もブレークポイントを設定し、ステップを進めて、UIImageViewコードが呼び出されています。残念ながら、私はそれが何をしているのかを見るためにフレームワークに入ることができません。UIImageViewは断続的にしか表示されません。

使用される変数はすべて地域や定数ですので、競合条件とは関係ありません。また、クリック数分待ってから画像を取得したり、ボタンを素早く押して複数の画像を重ねて表示することもできます(透明なのでスタックに気づくのは簡単です)。

私は(私はaddSubview:はそれをしないかなり確信しているにもかかわらず)addSubview:self.viewsetNeedsDisplayを実行しようとしたが、それは何もしませんでした。

displayPageNumber:をスレッドしないで直接呼び出しても、一貫して表示されません。

アイデア?

#define PageDisplayTime  0.5 
#define PageDisplayImageName @"PageIndicator.png" 
#define PageDisplayImage  [UIImage imageNamed: PageDisplayImageName] 

... 
[NSThread detachNewThreadSelector: @selector(displayPageNumber:) 
      toTarget: self withObject: index]; 
... 

- (void) displayPageNumber: (NSNumber*) _pageIndex 
{ 
    NSLog(@"Page Number: '%d'.", [_pageIndex integerValue] + 1); 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    UIImageView* glassPaneView = [[UIImageView alloc] initWithImage: PageDisplayImage]; 
    glassPaneView.center = CGPointMake(300.0, 300.0); 
    [self.view addSubview: glassPaneView]; 
    [NSThread sleepForTimeInterval: PageDisplayTime]; 
    [glassPaneView removeFromSuperview]; 
    [glassPaneView release]; 
    [pool release]; 
} 
+0

私は 'self.view'に永久的に存在するクラスメンバーを' UIImageView'にして、 'hidden'プロパティを切り替えてペインを表示し、同じ問題を抱えました。 – Jason

答えて

1

AFAIKすべてのUIコードはメインスレッドで行う必要があります。バックグラウンドスレッドで実行すると、予期しない結果が生じることがあります。さらに悪化するとクラッシュします。

スリープによって現在のスレッドが停止するだけで、ビューを削除するまで表示されないように描画を含む何もできないため、直接(したがってメインスレッドで)メソッドを呼び出すことはできません。

メインスレッドで呼び出された複数のメソッドにメソッドをリファクタリングする必要があります。まず、サブビューを追加してタイマーを設定するだけで、タイマー処理メソッドはサブビューを削除します。

0

私は問題を把握しました。他の人がこれに遭遇する場合は、 addSubview:/removeFromSuperviewのペアの間にsleepForTimeInterval:のペアがあります。私は睡眠がスレッドをブロックしたことを知っていたが、明らかにこのスレッドを解除してビューを更新する必要があります。私は(誤って表示される)ビューの更新がメインスレッドで起こったと仮定しました。

私の代わりの解決策は次のとおりです。 メインスレッドでサブビューを解除し、X秒間スリープしてサブビューを非表示にするメッセージでdetachNewThreadSelector:を呼び出します。 そして、私はNSLock edカウンタを追加するつもりです。これは、表示されなくなったときに増分され、hiderメッセージで減分されますが、カウンタが0になったときに非表示になります。

+0

トーマスの言うことはまだあります。別のスレッドでUIを使って何かを行うと、バグが発生します。最悪のものは即座に起こらないものです。 – jamie

+0

UIを更新するにはperformSelectorOnMainThreadを使用し、いつか後でビューを削除するハンドラを登録する必要があります。 – Shreesh

関連する問題