特定の条件に応じて、ビューの1つのボタンを動的に非表示にしたいのですが。
実際のビューを表示する前にボタンを非表示にするために、ビューコントローラーの-viewWillAppear
メソッドにコードを追加しようとしましたが、それを行う方法がまだわかりません。
IBOutletを介してボタンへの参照がありますが、ここから先に進む方法がわかりません。参考までに、これはUIBarButtonItemインスタンスです。
UIBarButtonItemを非表示にしようとしている場合、実際には親バーの内容を変更する必要があります。 UIToolBarの場合、バーの項目配列を、項目を含まない配列に設定する必要があります。
NSMutableArray *items = [[myToolbar.items mutableCopy] autorelease];
[items removeObject: myButton];
myToolbar.items = items;
バー項目をnilに設定します。
例えば:
self.navigationItem.leftBarButtonItem = nil;
だから私はベンの勝利のアプローチを試しましたが、結局私はそれが私の目的にとって間違っていることに気づきました-それはあなたがやろうとしていることに依存していると確信しています。特定の条件下でのみナビゲーションバーボタンを表示し、条件が満たされなくなるとすぐに非表示にしようとしました(私の場合、これは、UITextViewに関連付けられたキーボードを非表示にするために使用される[完了]ボタンです。ユーザーがテキストビューで入力しているときに表示されます)。私の手順は次のとおりです。
UIViewControllerクラスにプロパティとしてUIBarButtonItemを追加しました。 initWithNibNameメソッドでインスタンス化します。
ユーザーがテキストビューで入力を開始するとすぐに、UIBarButtonItemプロパティをナビゲーションバーのrightBarButtonItemとして割り当てました。
ユーザーが入力を完了したら、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;
隠そうとしているのがナビゲーションバーの[戻る]ボタンだけの場合は、もっと簡単な方法があります。
self.navigationItem.hidesBackButton = YES;
開発者ドキュメントからの引用:
hidesBackButton
戻るボタンを非表示にするかどうかを決定するブール値。
@property(nonatomic、assign)BOOL hidesBackButton
討論
このナビゲーション項目が最上位の項目であるときに戻るボタンが非表示の場合はYES。それ以外の場合、NO。デフォルト値はNOです。
可用性
IPhone OS 2.0以降で利用できます。
これは少しハックですが、私の場合は機能します(動的な間隔を適切に処理します)。
隠れる:
myButton.width = 0.1;
表示するには:
myButton.width = 0.0;
幅0.0は「自動幅」であり、幅が0.1の場合、ボタンは完全に消えます(Retinaディスプレイでこれを試したことはありませんが、ボタンの「スライバー」でさえありません)。
別のハッキーなソリューション:
myButton.customView = [[UIView alloc] init];
この回答はテキストベースの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小さな断片がまだ表示されていました。私のアプリでは、利用できないはずのアイテムをタップすることは受け入れられませんでした。上記のコードは、ボタンを非表示にし、ボタンを非アクティブにします。
上記のコードは、ユーザーイベントが発生したときに呼び出されるプライベートリフレッシュメソッドで呼び出します。
これに対する最善の解決策は、あまり技術的ではありません。必要なのは、通常のナビゲーションバー(上)またはツールバー(下)を作成することですが、オプションのボタンはありません。次に、同じで短いバーをもう1つ作成します。これをオプションボタンが必要な部分に配置し、この2番目の短いバーにオプションボタンを作成します。
追加バー全体でhidden = YES
を呼び出すことができます。
バーはシームレスに重なり合っているため、走行距離が異なる場合があります。
ベンの答えは技術的に正しいですが、カスタムUIToolbarで試してみると、UIBarButtonSystemItemFlexibleSpaceアイテムを使用しているため、アイテムが気に入らない方法で配置されます。
他のアイテムを同じ場所に留めておきたい場合は、フレキシブルスペースを固定スペースに設定するか、私がしたことを試す必要があります。
[filterBarButton.customView setHidden:YES];
注:これは、UIBarButtonItemがカスタムビューを使用する場合にのみ機能します。
UIButton
をUIBarButtonItem
に追加する場合は、単にUIBarButtonItem
を使用するのではなく、.
その後、UIButton.hidden
to TRUE
またはYES
およびそれ(およびUIBarButtonItem
)は表示されず、アクティブにもなりません。
お役に立てば幸いです。
これは、ナビゲーションバーの一部ではないボタンアイテムに対して行ったものです(ここで、Blank.pngは、私が作成した空白の画像で、置き換えた画像と同じサイズです)。
theButton.enabled = NO;
theButton.image = [UIImage imageNamed: @"Blank.png"];