1

UIViewに奇妙な問題があります:

長時間実行されているアクティビティを示すために、InterfaceBuilderで作成したアクティビティインジケータビューを表示したいと思います。

プリンシパルviewControllerのviewDidLoad関数で、次のようにActivityIndi​​catorビューを初期化します。

- (void)viewDidLoad {
    [super viewDidLoad];
    appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];        
    load = [[ActivityIndicatorViewController alloc] init];
    ...

ボタンを押すと、これはIBActionと呼ばれます。

- (IBAction)LaunchButtonPressed{            
    // Show the Activity indicator view.
    [self.view addSubview:load.view];

    // eavy work 
    [self StartWorking];    

    // Hide the loading view.
    [load.view removeFromSuperview];    
}

StartWorking関数で、インターネットサーバーにリクエストを送信し、返されるXMLファイルを解析します。

問題は、StartWorking関数を呼び出すと、アプリケーションがアクティビティインジケータービューを表示することではなく、StartWorking関数を使用して起動することです。一方、StartWorking関数の呼び出しを削除すると、ビューが表示されます。

誰かが私に理由を説明することができますか?:s

4

3 に答える 3

2

別のスレッドでStartWorkingメソッドを呼び出そうとしましたか?
おそらく、その重いプロセスにより、他の指示が実行されなくなります。

NSThreadクラス、特にdetachNewThreadSelector:toTarget:withObject:メソッドを見てください。

編集:プールの問題については、別のスレッドで呼び出された場合、StartWorking メソッドでプールを作成する必要があります。

- ( void )StartWorking
{
    NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ];

    /* Code here... */

    [ pool release ];
}
于 2010-04-21T09:39:03.537 に答える
1

交換 : [self.view addSubview:load.view];

と : [self performSelector:@selector(addLoadingSubview) afterDelay:0.1f];

そしてメソッドを作成します: -(void)addLoadingSubview{[self.view addSubview:load.view];}

于 2010-04-21T10:08:31.737 に答える
0

わかりました、私はサントーニの答えに基づいた解決策を見つけました:

- (IBAction)LaunchButtonPressed{            
    // Show the Activity indicator view.
    [self performSelector:@selector(ShowActivityIndicatorView) withObject:nil afterDelay:0];

    // eavy work 
    [self performSelector:@selector(StartWorking) withObject:nil afterDelay:2];  

    // Hide the loading view.
    [load.view removeFromSuperview];    
}

アクティビティ インジケーター ビューは、eavy 関数の呼び出しの前に表示されます。

回答ありがとうございます。

于 2010-04-21T10:29:33.593 に答える