2012-03-02 11 views
1

私はUIBarButtonItemを持っています(インタフェースビルダーで設定されています)。ユーザーがこのボタンをクリックすると、「重いプロセス」が開始され、ユーザーエクスペリエンスを向上させるために、このボタンを(UIActivityIndi​​catorView)で変更したいと考えています。アニメーションの後にUIBarButtonItemが消える

self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
    indicator.hidesWhenStopped = YES; 
    [self.heavyBarButton initWithCustomView:self.indicator]; 

    [self.indicator startAnimating]; 

    [NSThread detachNewThreadSelector:@selector(animateHeavyProcess) toTarget:self withObject:nil]; 

animateHeavyProcess:

 [self heavyProcess]; 
    [self.indicator stopAnimating]; 
    UIBarButtonItem *originalButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"maximize.png"] style:UIBarButtonItemStylePlain target:self action:@selector(startProcessClick:)]; 
    self.heavyBarButton = originalButton; 
    [originalButton release]; 

何が起こる:をユーザーがBarButtonアニメーションが開始され、ボタンが消滅を処理した後になりますクリックした後、私は次のようにそれを行います。ただし、元のボタンが再び表示されるようにします。

+0

どこに問題がありますか?問題は何ですか?あなたの質問は明確ではありません。 –

答えて

0

重いプロセスにGrand Central Dispatchを使用するとどうなりますか?私はそれがより便利だと思います。しかし、あなたはそのブロックにUIを使用することはできません。次に例を示します。iphone ios running in separate thread

-1

ボタンを置き換えるには、UIToolbarのsetItems:animated:メソッドを使用する必要があります。

0

セカンダリスレッドでUI更新を実行しないでください。 UIKitへの呼び出しはメインスレッド上になければなりません。

あなたはあなたのコードのUI更新部アウト分割することができます。

- (void)restoreBarButtonItem 
{ 
    [self.indicator stopAnimating]; 
    UIBarButtonItem *originalButton = [[UIBarButtonItem alloc] 
    initWithImage:[UIImage imageNamed:@"maximize.png"] 
    style:UIBarButtonItemStylePlain 
    target:self 
    action:@selector(startProcessClick:)]; 
    self.heavyBarButton = originalButton; 
    [originalButton release]; 
} 

そして、あなたの重い処理(セカンダリスレッドで実行されているが)ただ、メインスレッド上で、この新しいUIのupdateメソッドを呼び出します。

- (void)animateHeavyProcess 
{ 
    [self heavyProcess]; 
    [self performSelectorOnMainThread:@selector(restoreBarButtonItem:) 
    withObject:nil 
    waitUntilDone:NO]; 
} 
関連する問題