我想在导航栏上有两个rightBarButtonItems。一个用于编辑,另一个用于添加。
显然我无法使用Interface Builder。
有人知道如何以编程方式执行此操作吗?谢谢!
答案 0 :(得分:68)
现在包含在iOS 5中并被称为rightBarButtonItems,注意复数
以下是apple docs:
中的文字rightBarButtonItems
要在导航栏右侧显示的自定义栏按钮项目数组 当接收者是顶部导航项时。
@property(非原子,复制)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];
答案 1 :(得分:37)
下面是一个如何添加两个按钮作为右键按钮的示例。下面的代码创建了一个包含向上和向下箭头按钮的分段控件,然后将其添加为导航右键按钮的自定义视图:
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;
答案 2 :(得分:4)
我的建议是不要在导航栏中将添加功能实现为按钮。我假设您正在处理下面项目的表格视图,因此处理此用户交互的一种方法是在表格视图中显示“添加新项目”选项作为最后一个条目。当用户通过实现以下委托方法点击导航栏中的“编辑”按钮时,可以以编程方式淡化:
- (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:实现中为它提供一个名称,并处理它的行选择。
答案 3 :(得分:2)
导航栏是一个UIView,因此您只需创建一个规则UIButton并将其作为子视图添加到导航栏。
相对于导航栏设置框架。如果您希望它看起来与内置按钮完全相同,您可能必须自己生成图形,因为它们不会暴露给SDK AFAIK。
答案 4 :(得分:2)
如果您希望将两个单独的按钮设置为rightBarButtonItem
,则可以通过将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];
答案 5 :(得分:2)
这是非常简单的2行答案:
步骤1:为您想要的任何内容创建自定义视图的笔尖
步骤2:将笔尖作为自定义视图添加到工具栏中:
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"TwoButtonView" owner:self options:nil];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[subviewArray objectAtIndex:0]];
答案 6 :(得分:0)
要显示独立按钮(而不是分段控制按钮):
// 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];
答案 7 :(得分:0)
您可以从Interface Builder执行此操作。我在我的应用程序中做了什么 - 只是在导航栏的左侧项目中添加了UIView,并在此视图中放置了3个按钮并连接了他们的操作。您可以按照此操作在左/右导航项中添加多个按钮。
答案 8 :(得分:0)
如果有人路过,这里的答案很快:
let barButton_array: [UIBarButtonItem] = [Button1, Button2]
navigationItem.setRightBarButtonItems(barButton_array, animated: false)