web-dev-qa-db-ja.com

ビューからボタンを動的に非表示にするにはどうすればよいですか?

特定の条件に応じて、ビューの1つのボタンを動的に非表示にしたいのですが。

実際のビューを表示する前にボタンを非表示にするために、ビューコントローラーの-viewWillAppearメソッドにコードを追加しようとしましたが、それを行う方法がまだわかりません。

IBOutletを介してボタンへの参照がありますが、ここから先に進む方法がわかりません。参考までに、これはUIBarButtonItemインスタンスです。

36
jpm

UIBarButtonItemを非表示にしようとしている場合、実際には親バーの内容を変更する必要があります。 UIToolBarの場合、バーの項目配列を、項目を含まない配列に設定する必要があります。

NSMutableArray     *items = [[myToolbar.items mutableCopy] autorelease];
[items removeObject: myButton];
myToolbar.items = items;
54
Ben Gottlieb

バー項目をnilに設定します。

例えば:

self.navigationItem.leftBarButtonItem = nil;
20
Rose

だから私はベンの勝利のアプローチを試しましたが、結局私はそれが私の目的にとって間違っていることに気づきました-それはあなたがやろうとしていることに依存していると確信しています。特定の条件下でのみナビゲーションバーボタンを表示し、条件が満たされなくなるとすぐに非表示にしようとしました(私の場合、これは、UITextViewに関連付けられたキーボードを非表示にするために使用される[完了]ボタンです。ユーザーがテキストビューで入力しているときに表示されます)。私の手順は次のとおりです。

  1. UIViewControllerクラスにプロパティとしてUIBarButtonItemを追加しました。 initWithNibNameメソッドでインスタンス化します。

  2. ユーザーがテキストビューで入力を開始するとすぐに、UIBarButtonItemプロパティをナビゲーションバーのrightBarButtonItemとして割り当てました。

  3. ユーザーが入力を完了したら、UIBarButtonItemプロパティをnilに設定します。

それは魅力のように働いています。以下にいくつかのコードサンプルを追加します。

まず、ビューコントローラーのinitメソッドでボタンをインスタンス化します。

barButtonItemDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];

次に、ユーザーがテキストビューの編集を開始するとすぐに呼び出されるデリゲートメソッドの右側のバーボタンとして設定します。

self.navigationItem.rightBarButtonItem=[self barButtonItemDone];

最後に、ボタン自体をクリックすると、「done」というメソッドが呼び出され、そのメソッド内でrightBarButtonItemをnilに設定するだけです。

self.navigationItem.rightBarButtonItem=nil;
11

隠そうとしているのがナビゲーションバーの[戻る]ボタンだけの場合は、もっと簡単な方法があります。

self.navigationItem.hidesBackButton = YES;

開発者ドキュメントからの引用:

hidesBackButton

戻るボタンを非表示にするかどうかを決定するブール値。

@property(nonatomic、assign)BOOL hidesBackButton

討論

このナビゲーション項目が最上位の項目であるときに戻るボタンが非表示の場合はYES。それ以外の場合、NO。デフォルト値はNOです。

可用性

IPhone OS 2.0以降で利用できます。

10
Sara

これは少しハックですが、私の場合は機能します(動的な間隔を適切に処理します)。

隠れる:

myButton.width = 0.1;

表示するには:

myButton.width = 0.0;

幅0.0は「自動幅」であり、幅が0.1の場合、ボタンは完全に消えます(Retinaディスプレイでこれを試したことはありませんが、ボタンの「スライバー」でさえありません)。

7
Michael

別のハッキーなソリューション:

myButton.customView = [[UIView alloc] init];
5
jonnysamps

この回答はテキストベースのUIBarButtonItemsに関するものですが、同じ概念を他のタイプのボタンにも適用できます。これにより、両方を非表示にすることができますandアイテムを再び表示します。上記の回答の多く(たとえば、ボタンの値をnilに設定すると、必要に応じてボタンを再表示できません)。

TL; DR:

if (shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = nil;
    self.myBarButtonItem.action = nil;
} else if (!shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = @"Title";
    self.myBarButtonItem.action = @selector(mySelector:);
}

長いバージョン:

非表示にしようとしたUIBarButtonItemはUINavigationBarではなくUIToolbarにあるため、ナビゲーション項目の左側(または右側)のbarButtonItemプロパティにアクセスするすべての提案が機能しません。また、上記のとおり、状況が変化したときにボタンを再表示したいと考えました。

マイケルの提案は機能に最も近いものでしたが、少なくともiOS 7では、タップ可能なボタンのvery小さな断片がまだ表示されていました。私のアプリでは、利用できないはずのアイテムをタップすることは受け入れられませんでした。上記のコードは、ボタンを非表示にし、ボタンを非アクティブにします。

上記のコードは、ユーザーイベントが発生したときに呼び出されるプライベートリフレッシュメソッドで呼び出します。

2

これに対する最善の解決策は、あまり技術的ではありません。必要なのは、通常のナビゲーションバー(上)またはツールバー(下)を作成することですが、オプションのボタンはありません。次に、同じで短いバーをもう1つ作成します。これをオプションボタンが必要な部分に配置し、この2番目の短いバーにオプションボタンを作成します。

追加バー全体でhidden = YESを呼び出すことができます。

バーはシームレスに重なり合っているため、走行距離が異なる場合があります。

2
Marius

ベンの答えは技術的に正しいですが、カスタムUIToolbarで試してみると、UIBarButtonSystemItemFlexibleSpaceアイテムを使用しているため、アイテムが気に入らない方法で配置されます。

他のアイテムを同じ場所に留めておきたい場合は、フレキシブルスペースを固定スペースに設定するか、私がしたことを試す必要があります。

[filterBarButton.customView setHidden:YES];

注:これは、UIBarButtonItemがカスタムビューを使用する場合にのみ機能します。

1
Jon

UIButtonUIBarButtonItemに追加する場合は、単にUIBarButtonItemを使用するのではなく、.

その後、UIButton.hidden to TRUEまたはYESおよびそれ(およびUIBarButtonItem)は表示されず、アクティブにもなりません。

お役に立てば幸いです。

1

これは、ナビゲーションバーの一部ではないボタンアイテムに対して行ったものです(ここで、Blank.pngは、私が作成した空白の画像で、置き換えた画像と同じサイズです)。

theButton.enabled = NO;
theButton.image = [UIImage imageNamed: @"Blank.png"];
1
Gary Riley