2

iPhoneアプリのナビゲーションバーに更新UIBarButtonItemを追加しました。ユーザーがボタンをタップしたら、更新ボタンをアニメーション化されたアクティビティインジケーターに変更し、操作(この場合はダウンロード)が完了したら、アクティビティインジケーターを更新ボタンに戻します。

IBを使用して更新ボタンを追加しました。次に、ボタンをタップして、新しいアクティビティインジケーターを作成し、元の更新ボタンへのポインターを保持します。そのようです:

refreshButtonItem = self.navigationItem.leftBarButtonItem;
if (activityButtonItem == nil)
{
    activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20,20)];
    activityButtonItem = [[UIBarButtonItem alloc]initWithCustomView:activityIndicator];

}
self.navigationItem.leftBarButtonItem = activityButtonItem;
[activityIndicator startAnimating];

ここまでは順調ですね。問題は、ダウンロードが終了し、更新ボタンを再度追加しようとしたときに(以下を使用して)、次のことです。

[activityIndicator stopAnimating];
self.navigationItem.leftBarButtonItem = refreshButtonItem;

次のエラーが発生します:
[UIBarButtonItem hold]:メッセージが割り当て解除されたインスタンスに送信されました

私は明示的にリリースを呼び出していません。

A)これはいつ/どこで割り当てが解除されますか

B)私が探しているものを達成するためのより良い方法はありますか?

4

2 に答える 2

1

activityButtonItemをleftBarButtonItemに割り当てると、leftBarButtonItemがポイントしていたアイテムが解放されます。leftBarButtonItem(およびretainオプションを持つすべてのプロパティ)は、次のように実装されます。

- (void)leftBarButtonItem:(UIBarButtonItem *)newItem {
  if (newItem != self.leftBarButtonItem) {
    [self.leftBarButtonItem release];
    leftBarButtonItem = [newItem retain];
  }
}

leftBarButtonItemを再割り当てした後にrefreshButtonItemを使用する場合は、最初の行を次のように変更します。

refreshButtonItem = [self.navigationItem.leftBarButtonItem retain];

于 2010-02-12T03:23:53.950 に答える
0

ARCが導入されたiOS5以降、保持する必要はなくなりました。

解決策は、@ cagreenが説明したように取得できますが、refreshButtonItemは、loadingButtonとloadingViewと同様に、クラスプロパティとして格納できます。

インターフェイスで次のように宣言します。

@property (strong, nonatomic) UIBarButtonItem *refreshButton;
@property (strong, nonatomic) UIBarButtonItem *loadingButton;
@property (strong, nonatomic) UIActivityIndicatorView *loadingView;

viewDidLoadメソッドでloadingButtonとloadingViewを初期化します。

self.loadingView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
self.loadingButton = [[UIBarButtonItem alloc] initWithCustomView:self.loadingView];

次に、ローディングスピナーを表示するには、次のようにします。

 // Shows loading button
- (void)showLoadingView {

    // Keep reference to right bar button
    if (self.navigationItem.rightBarButtonItem) {
        self.refreshButton = self.navigationItem.rightBarButtonItem;
    }

    // Start animating and assign loading button to right bar button
    [self.loadingView startAnimating];
    self.navigationItem.rightBarButtonItem = self.loadingButton;
}

そして隠すために:

 // Hides loading button
- (void)hideLoadingView {
    [self.loadingView stopAnimating];
    self.navigationItem.rightBarButtonItem = self.refreshButton;
}
于 2017-01-20T10:53:45.943 に答える