267

IB でいくつかのボタンを備えたツールバーを作成しました。メイン ウィンドウのデータの状態に応じて、ボタンの 1 つを非表示/表示できるようにしたいと考えています。

UIBarButtonItemには隠しプロパティがありません。これまでに見つけた非表示の例には、ナビゲーション バー ボタンを nil に設定することが含まれています。ちなみに、ボタンを IBOutlet に接続した場合、それを nil に設定すると、どのように戻すかわかりません)。

4

37 に答える 37

270

ボタンを強力なアウトレットに保存し(それを と呼びましょうmyButton)、これを実行して追加/削除します。

// Get the reference to the current toolbar buttons
NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy];

// This is how you remove the button from the toolbar and animate it
[toolbarButtons removeObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];

// This is how you add the button to the toolbar and animate it
if (![toolbarButtons containsObject:self.myButton]) {
    // The following line adds the object to the end of the array.  
    // If you want to add the button somewhere else, use the `insertObject:atIndex:` 
    // method instead of the `addObject` method.
    [toolbarButtons addObject:self.myButton];
    [self setToolbarItems:toolbarButtons animated:YES];
}

アウトレットに保存されるため、ツールバーにない場合でも参照を保持できます。

于 2012-04-05T03:18:18.560 に答える
224

私はこの答えがこの質問に遅れていることを知っています。ただし、他の誰かが同様の状況に直面している場合は役立つかもしれません。

iOS 7 では、バー ボタン項目を非表示にするために、次の 2 つの手法を使用できます。

  • 使用SetTitleTextAttributes:-これは、「完了」、「保存」などのバーボタンアイテムではうまく機能します。ただし、テキストではないため、追加、ゴミ箱シンボルなどのアイテムでは機能しません(少なくとも私にとってはそうではありません)。
  • 使用TintColor:-「deleteButton」というバーボタンアイテムがある場合:-

ボタンを非表示にするために、次のコードを使用しました:-

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];

ボタンを再度表示するには、次のコードを使用しました:-

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
于 2014-07-09T00:48:44.723 に答える
67

簡単なアプローチは次のとおりです。

hide:  barbuttonItem.width = 0.01;
show:  barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)

Retina iPadで実行したところ、.01は小さすぎて表示されませんでした。

于 2012-08-25T19:31:28.697 に答える
35

Swift 3 および Swift 4 の場合、これを実行して以下を非表示にできますUIBarButtomItem

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear

そして表示するにはUIBarButtonItem

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue

で、tintColor使用している元の色を指定する必要がありますUIBarButtomItem

于 2016-12-02T19:50:06.320 に答える
22

現在、OS X Yosemite Developer Preview 7 と iOS 7.1 をターゲットとする Xcode 6 beta 6 を実行していますが、次のソリューションは問題なく動作します。

  • UINavigationItemおよびUIBarButtonItemのアウトレットを作成する
  • 次のコードを実行して削除します

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
    
  • 次のコードを実行して、ボタンを再度追加します

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];
    
于 2014-09-23T01:53:52.050 に答える
14

プロジェクトで IBOutlets を使用しました。だから私の解決策は次のとおりでした:

@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()

このバーを再度表示する必要がある場合は、逆のプロパティを設定してください。

Swift 3では、代わりにプロパティをenable使用しisEnableます。

于 2016-06-19T13:58:01.990 に答える
13

self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

于 2012-12-12T09:02:17.817 に答える
9

Swiftで試してtintColorください。AppDelegate のフォント サイズのような UIBarButtonItem のデザインがある場合は、更新しないでください。表示時にボタンの外観が完全に変わります。

テキスト ボタンの場合、タイトルを変更するとボタンが「消える」ことがあります。

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
于 2015-04-15T15:09:54.610 に答える
5

@lnafzigerの回答からの改善

Barbuttons を強力なアウトレットに保存し、これを実行して非表示/表示します。

-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you remove the button from the toolbar and animate it
    [navBarBtns removeObject:myButton];
    [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}


-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you add the button to the toolbar and animate it
    if (![navBarBtns containsObject:myButton]) {
        [navBarBtns addObject:myButton];
        [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
    }
}

必要な場合は、以下の関数を使用してください..

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
于 2015-11-20T11:16:49.267 に答える
5

設定 barButton.customView = UIView()してトリックを見るだけ

于 2017-08-04T07:40:35.760 に答える
4

UIBarButtonItem を「非表示」にする方法はありません。再度表示する場合は、スーパービューから削除して追加し直す必要があります。

于 2012-04-05T02:29:16.627 に答える
3

これを行う 1 つの方法は initWithCustomView:(UIView *)、 を割り当てるときに のプロパティを使用することですUIBarButtonItem。のサブクラスにUIViewは、非表示/非表示のプロパティがあります。

例えば:

1.UIButton非表示/非表示にしたいを持っています。

2.UIButtonカスタム ビューとして作成します。お気に入り :

UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button

UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];

3.作成した を非表示/非表示にするmyButtonことができます。[myButton setHidden:YES];

于 2012-04-05T03:26:59.083 に答える
2

If you are using Swift 3

if (ShowCondition){
   self.navigationItem.rightBarButtonItem = self.addAsset_btn 
 } 
else {
   self.navigationItem.rightBarButtonItem = nil
 }
于 2016-10-25T07:14:04.807 に答える
2

バーボタン項目が無効になっているときにテキストの色をクリアな色に設定すると、おそらくよりクリーンなオプションになります。コメントで説明しなければならないような奇妙さはありません。また、ボタンを破棄しないため、関連付けられているストーリーボードのセグエは引き続き保持されます。

[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
                                                      forState:UIControlStateDisabled];

次に、バーボタンアイテムを非表示にしたいときはいつでも、次のようにすることができます:

self.navigationItem.rightBarButton.enabled = NO;

隠しプロパティがないのは残念ですが、これは同じ結果を提供します。

于 2014-04-04T17:28:11.140 に答える
2

複数のツールバーとそれぞれに複数のボタンがあるため、lnafzigerの受け入れられた回答に基づいて共有すると思ったいくつかのヘルパーメソッド:

-(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    [toolbarButtons removeObject:button];
    [toolbar setItems:toolbarButtons animated:NO];
}

-(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    if (![toolbarButtons containsObject:button]){
        [toolbarButtons insertObject:button atIndex:index];
        [self setToolbarItems:toolbarButtons animated:YES];
    }
}
于 2015-11-13T01:18:44.170 に答える
2

UIBarButtonItem にテキストではなく画像がある場合、これを実行して非表示にすることができます。 navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

于 2014-06-10T19:58:06.493 に答える
1

テキスト属性を使用して、バー ボタンを非表示にすることができます。

barButton.enabled = false
barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)

同様の質問については、UIBarButtonItem 拡張機能を使用した私のソリューションも参照してください: Make a UIBarButtonItem disapear using swift IOS

于 2015-08-21T11:43:40.243 に答える
0

@lnafziger、@MindSpiker、@vishal などの功績によるものです。アル、

単一の右 (または左) バー ボタンに対して到達した最も単純なライナーは次のとおりです。

self.navigationItem.rightBarButtonItem = <#StateExpression#>
    ? <#StrongPropertyButton#> : nil;

次のように:

@interface MyClass()

@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;

@end

@implementation

- (void) updateState
{
    self.navigationItem.rightBarButtonItem = <#StateExpression#>
        ? <#StrongPropertyButton#> : nil;
}

@end

これをテストしたところ、うまくいきました(IB経由で配線された強力なバーボタンアイテムを使用)。

于 2014-02-09T17:23:50.653 に答える
0

IB では、ボタンのタイトルを空白のままにすると表示されません (初期化されませんか?)。バーボタンアイテムを削除せずにビルドのために一時的に非表示にしたい場合、UIの更新中の開発中にこれを頻繁に行い、すべてのアウトレット参照を破棄します。

ボタンのタイトルを nil に設定しても、ボタン全体が消えることはありません。申し訳ありませんが、あなたの質問には実際には答えていませんが、一部の人にとっては役立つかもしれません.

編集: このトリックは、ボタンのスタイルがプレーンに設定されている場合にのみ機能します

于 2013-01-10T21:00:18.700 に答える
0

toolbar.items 配列を操作する必要があります。

[完了] ボタンを非表示および表示するために使用するコードを次に示します。ボタンがツールバーの端にある場合、または他のボタンの間にある場合、他のボタンが移動します。そのため、ボタンを非表示にする場合は、ボタンを最後のボタンとして中央に配置します。ボタンの動きをアニメートして効果を上げています。とても気に入っています。

-(void)initLibraryToolbar {

    libraryToolbarDocumentManagementEnabled = [NSMutableArray   arrayWithCapacity:self.libraryToolbar.items.count];
    libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
    [libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
    [libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
    trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
    mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
    [libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
    trashCan.enabled = NO;
    mail.enabled = NO;
    [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];

}

次のコードを使用してボタンを表示できます

[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES; 

またはボタンを非表示にする

[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;
于 2012-04-05T02:47:14.250 に答える
0

ここでまだ言及されていないので、ここに私の解決策を追加します。画像が 1 つのコントロールの状態に依存する動的ボタンがあります。私にとって最も簡単な解決策はnil、コントロールが存在しない場合に画像を設定することでした。コントロールが更新されるたびに画像が更新されるため、これは私にとって最適でした。念のため、 も に設定enabledNOます。

幅を最小値に設定しても、iOS 7 では機能しませんでした。

于 2013-11-10T20:36:45.737 に答える
0

私はxibとUIToolbarで作業しました。BarButtonItem は xib ファイルで作成されました。BarButtonItem の IBOutlet を作成しました。そして、このコードを使用して BarButtonItem を非表示にしました

 self.myBarButtonItem.enabled = NO;
 self.myBarButtonItem.title =  nil;

これは私を助けました。

于 2015-01-20T13:20:57.790 に答える
0

leftBarButtonItems が 2 つあるという問題がありました。Mac Catalyst では、firstButton は、サポートされていないアクションを指していました: AVFoundation でビデオを録画します。2 番目のボタンのみが Mac Catalyst で有効でした: UIImagePickerController を使用します。

そのため、Mac Catalyst では、最初の UIBarButtonItem を secondButton に向け、常に 2 番目の UIBarButtonItem を非表示にする必要がありました。iOS では、両方のボタンが表示されます。これが私の解決策でした:

#if TARGET_OS_MACCATALYST
        self.navigationItem.leftBarButtonItem = self.secondButton;
        NSUInteger count = [self.navigationItem.leftBarButtonItems count];
        for (NSUInteger i = 0; i < count; i++) {
            UIBarButtonItem *thisButton = [self.navigationItem.leftBarButtonItems objectAtIndex:i];
            if (i == 1) {
                thisButton.enabled = NO;
                thisButton.tintColor = [UIColor clearColor];
            }
        }
#else
        self.navigationItem.leftBarButtonItem = self.firstButton;
#endif

同等の問題を抱えている人に役立つことを願っています。

于 2020-04-25T15:45:06.367 に答える
-5

私のソリューションはbounds.width、UIBarButtonItem内にあるものに対して0に設定されています(私はUIButtonとUISearchBarでこのアプローチを使用しました):

隠れる:

self.btnXXX.bounds = CGRectMake(0,0,0,0);

公演:

self.btnXXX.bounds = CGRectMake(0,0,40,30); // <-- put your sizes here
于 2012-05-25T03:08:21.940 に答える