web-dev-qa-db-ja.com

ナビゲーションバーに複数のrightBarButtonItem

ナビゲーションバーに2つのrightBarButtonItemsを配置したいと思います。 1つは編集用で、もう1つは追加用です。

明らかに、InterfaceBuilderを使用して作成することはできません。

プログラムでそれを行う方法を知っている人はいますか?ありがとう!

24
mobilefun

これはiOS5に含まれ、rightBarButtonItemsと呼ばれます。複数形に注意してください。

これが Apple docs からのテキストです:

rightBarButtonItems

受信者が一番上のナビゲーションアイテムである場合にナビゲーションバーの右側に表示するカスタムバーボタンアイテムの配列。

@property(nonatomic、copy)NSArray * rightBarButtonItems

討論

この配列には、右側に表示する0個以上のバーボタンアイテムを含めることができます。
ナビゲーションバー。アイテムは、配列に表示されるのと同じ順序で右から左に表示されます。したがって、配列の最初の項目は右端の項目であり、他の項目は前の項目の左側に追加されます。

配列内のすべてのアイテムを表示するのに十分なスペースがない場合、タイトルビュー(存在する場合)またはバーの左側にあるボタンと重なるアイテムは表示されません。
が表示されます。

配列の最初の項目は、rightBarButtonItemプロパティを使用して設定することもできます。

UINavigationBar.hで宣言

ナビゲーションバーの右側に検索アイコンと編集アイコンを実装した方法は次のとおりです。

UIBarButtonItem *searchButton         = [[UIBarButtonItem alloc]
                                         initWithBarButtonSystemItem:UIBarButtonSystemItemSearch
                                         target:self
                                         action:@selector(searchItem:)];

UIBarButtonItem *editButton          = [[UIBarButtonItem alloc] 
                                         initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
                                         target:self action:@selector(editItem:)];

self.navigationItem.rightBarButtonItems =
[NSArray arrayWithObjects:editButton, searchButton, nil];
68
jroyce

右バーボタンとして2つのボタンを追加する方法の例を次に示します。以下のコードは、上下の矢印ボタンを含むセグメント化されたコントロールを作成し、ナビゲーションの右バーボタンのカスタムビューとして追加されます。

UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray array]];
    [segmentedControl setMomentary:YES];
    [segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"icon-triangle-up.png"] atIndex:0 animated:NO];
    [segmentedControl insertSegmentWithImage:[UIImage imageNamed:@"icon-triangle-down.png"] atIndex:1 animated:NO];
    segmentedControl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    [segmentedControl addTarget:self action:@selector(segmentedAction:) forControlEvents:UIControlEventValueChanged];

    UIBarButtonItem * segmentBarItem = [[UIBarButtonItem alloc] initWithCustomView: segmentedControl];
    self.navigationItem.rightBarButtonItem = segmentBarItem;
37
Mario

私の提案は、ナビゲーションバーのボタンとして追加機能を実装しないことです。以下のアイテムのテーブルビューを扱っていると想定しているため、このユーザーインタラクションを処理する1つの方法は、テーブルビューの最後のエントリとして[新しいアイテムの追加]オプションを表示することです。これは、ユーザーが次のデリゲートメソッドを実装することにより、ナビゲーションバーの[編集]ボタンをタップしたときにプログラムでフェードインする可能性があります。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    [self.tableView beginUpdates];
    [self.tableView setEditing:editing animated:YES];

    if (editing)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[objects count] inSection:0];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];           
    }
    else
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[objects count] inSection:0];     
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];           
    }
    [self.tableView endUpdates];
}

次に、以下を使用して行数を増やして、余分な行が考慮されていることを確認する必要があります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    if (tableView.editing)
        return ([objects count] + 1);
    else
        return [objects count];     
}

次に、通常の削除編集スタイルとは対照的に、左側に緑色のプラス記号を表示します。

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (self.editing == NO || !indexPath) return UITableViewCellEditingStyleNone;
    if (indexPath.row >= [objects count]) 
        return UITableViewCellEditingStyleInsert;
    else
        return UITableViewCellEditingStyleDelete;

    return UITableViewCellEditingStyleNone;
}

もちろん、cellForRowAtIndexPath:実装でその名前を指定し、その行選択も処理する必要があります。

4
Brad Larson

ナビゲーションバーはUIViewであるため、規則的なUIButtonを作成し、それをサブビューとしてナビゲーションバーに追加するだけです。

ナビゲーションバーを基準にしてフレームを設定します。組み込みのボタンとまったく同じように見せたい場合は、SDK AFAIKに公開されていないため、グラフィックを自分で作成する必要があります。

2
Rog

rightBarButtonItemとして2つの別々のボタンが必要な場合は、右側のバー項目にカスタムビューとしてUIToolbarを追加します。

/*************************************************
       CREAT TWO RIGHT BAR BUTTON ITEMS
   *************************************************/
    // create a toolbar to have two buttons in the right
    UIToolbar* customToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 90, 44.01)];

    // create the array to hold the buttons, which then gets added to the toolbar
    NSMutableArray* rightBarButtonArray = [[NSMutableArray alloc] initWithCapacity:2];

    //Add the info button to the array
    UIButton* infoViewButton = [[UIButton buttonWithType:UIButtonTypeInfoLight] retain];
    [infoViewButton addTarget:self action:@selector(showInfoView) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *infoItem =  [[UIBarButtonItem alloc] initWithCustomView:infoViewButton];
    [rightBarButtonArray addObject:infoItem];
    [infoItem release];

    //Add the Done Button to the array
    UIBarButtonItem *bbi;
    bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                                                        target:self 
                                                        action:@selector(create:)];

    [rightBarButtonArray addObject:bbi];
    [bbi release];

    //add the array to the custom toolbar
    [customToolbar setItems:rightBarButtonArray animated:NO];
    [rightBarButtonArray release];

    // and finally add the custom toolbar as custom view to the right bar item
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customToolbar];
    [customToolbar release];
2
d.ennis

これが本当に簡単な2行の答えです:

ステップ1:必要なコンテンツを含むカスタムビューのペン先を作成する

手順2:カスタムビューとしてペン先をツールバーに追加します。

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"TwoButtonView" owner:self options:nil];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[subviewArray objectAtIndex:0]];
2
Caleb

誰かが通りかかった場合、ここにSwift回答:

let barButton_array: [UIBarButtonItem] = [Button1, Button2]
navigationItem.setRightBarButtonItems(barButton_array, animated: false)
1
Mehdi S.

表示するには独立したボタン(セグメント化されたコントロールボタンの代わりに):

// create a toolbar to have two buttons in the right
UIToolbar* tools = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 133, 44.01)];

// create the array to hold the buttons, which then gets added to the toolbar
NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3];

// create a standard "add" button
UIBarButtonItem* bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:NULL];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];

// create a spacer
bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[buttons addObject:bi];

// create a standard "refresh" button
bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];

// stick the buttons in the toolbar
[tools setItems:buttons animated:NO];

// and put the toolbar in the nav bar
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];

あなたはInterfaceBuilderからそれを行うことができます。私がアプリで行ったこと-ナビゲーションバーの左側のアイテムにUIViewを追加し、このビューに3つのボタンを配置して、それらのアクションを接続しました。これに従って、左右のナビゲーション項目に複数のボタンを追加できます。

参照: サブペン先のツールバー項目

enter image description here

0
Vijay Sharma