0

私のセットアップ:

私の iPhone アプリには、読み込み中のビュー (UIImageView 自体) と、読み込み中のビューの 2 つのサブビュー、UIIndicatorView と UILabel があります。[self.view addSubview:loadingView]表示するにはメソッドを呼び出し、非表示にするには を使用します[loadingView removeFromSuperView]

データを更新するアプリには、メソッドがあり-(void)refreshDataます。このメソッドでは、サブビューを表示し、HTTP POST から得られたデータをダウンロードし、このデータを使用して NSXMLParser を開始します。

NSXMLParser がそのメソッドの最後の要素に到達すると-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName、サブビューを非表示にします (上記のメソッドを使用)。

メソッドを呼び出すにrefreshDataは、ナビゲーション バーに更新ボタンがあります。

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];


私の問題:

更新ボタンをクリックすると、サブビューが表示されません。ログにはっきりと表示されるため、メソッドを呼び出します。

ロード ビューの表示

読み込みプロセス中に表示される一連の行 (合計 15 秒)

読み込みビューを非表示にする

ビューを非表示にするものをコメントアウトすると、アプリを閉じるまで読み込みビューが引き続き表示されるため、メソッドが機能することも知っています

何か案は?

4

2 に答える 2

3

同じイベント コールバック内ですべての非表示と表示を行っている場合、GUI を実際に更新する機会が与えられていません。作業に時間がかかる場合 (15 秒など) は、NSOperation を使用して操作を実行し、終了コールバックが発生したときにビューを非表示にすることができます。

http://developer.apple.com/iphone/library/documentation/cocoa/Reference/NSOperation_class/Reference/Reference.html

こちらの方が使いやすいかもしれません: http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/NSInvocationOperation_Class/Reference/Reference.html#//apple_ref/occ/cl/NSInvocationOperation

GUI を更新する場合は、NSOperation メソッドのイベントからではなく、メイン スレッドから行うようにしてください。

このメソッドを使用して、メイン スレッドでセレクターを実行できます。 http://developer.apple.com/iphone/library/documentation/cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelectorOnMainThread:withObject:waitUntilDone :

より良い答えのために:ロードを行うコードで、データを取得するために作業を行っていたものを実行します:

// Code to show loading gui
[[[NSInvocationOperation alloc] initWithTarget:self 
               selector:@selector(refreshData) object:nil] autorelease];

次に、refreshData の場合:

- (void) refreshData {
   // do the work
   [self performSelectorOnMainThread:@selector(doneRefresing) 
                          withObject:nil waitUntilDone:NO] ;
 }
于 2009-11-24T02:19:49.173 に答える
1


ドキュメントから:

レシーバーのスーパービューが nil でない場合、このメソッドはレシーバーを解放します。ビューを再利用する予定がある場合は、このメソッドを呼び出す前にビューを保持し、作業が終了したとき、またはビューを別のビュー階層に追加した後に、必要に応じて解放してください。

したがって、'removeFromSuperview' を使用すると、実際にオブジェクトを解放するだけでなく、そのスーパービューからオブジェクトを削除することもできます。

于 2009-12-24T16:01:23.273 に答える