在iOS 5中使用Storyboard时,无法为UINavigationItem分配多个按钮

use*_*395 25 interface-builder storyboard uinavigationitem ipad ios

我是一名iOS开发人员,在通过代码开发UI方面拥有丰富的经验.

我现在正在测试Storyboard功能,因为我测试切换到"设计"UI而不是实现它.在过去,我坚持使用nib/xib的极限,因此我从未成功使用过开关.所以这里有一个关于storyboading的新尝试:)

现在我的问题 - 我正在设计一个iPad故事板,它有一个导航控制器和一个Tableview控制器.我想添加多个UIBarButtonItems,但我可以使用Interface Builder为每一方添加一个.

代码看起来像:

UIBarButtonItem *b = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:nil action:nil];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spacer.width = 20;

self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:self.editButtonItem, spacer, b, nil];
Run Code Online (Sandbox Code Playgroud)

但为什么我不能使用IB添加多个按钮?leftBarButtonItem,rightBarButtonItems,backBarButtonItems只有出口...

这真让我抓狂

谢谢!

Shi*_*tem 64

我找到了一个简单的解决方

1)添加以下类别:

@interface UINavigationItem(MultipleButtonsAddition)
@property (nonatomic, strong) IBOutletCollection(UIBarButtonItem) NSArray* rightBarButtonItemsCollection;
@property (nonatomic, strong) IBOutletCollection(UIBarButtonItem) NSArray* leftBarButtonItemsCollection;
@end

@implementation UINavigationItem(MultipleButtonsAddition)

- (void) setRightBarButtonItemsCollection:(NSArray *)rightBarButtonItemsCollection {
    self.rightBarButtonItems = [rightBarButtonItemsCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}

- (void) setLeftBarButtonItemsCollection:(NSArray *)leftBarButtonItemsCollection {
    self.leftBarButtonItems = [leftBarButtonItemsCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]];
}

- (NSArray*) rightBarButtonItemsCollection {
    return self.rightBarButtonItems;
}

- (NSArray*) leftBarButtonItemsCollection {
    return self.leftBarButtonItems;
}

@end
Run Code Online (Sandbox Code Playgroud)

2)将您的项目添加到视图控制器(项目将按标签升序排序)

在此输入图像描述

3)将您的项目与UINavigationItem leftBarButtonItemsCollectionrightBarButtonItemsCollection出口集合连接

在此输入图像描述

  • 这是一个美丽的解决方案,应该是公认的答案. (14认同)
  • 很棒的答案.对于那些在步骤3中遇到问题的人,选择你拖动的导航项并添加到故事板中的控制器,它的出口下面会有`rightBarButtonItemsCollection`.从中拖动到控制器中的项目以连接它们. (2认同)

HpT*_*erm 26

编辑

当我回答这个问题时,Xcode没有提供在故事板中链接添加按钮的可能性.提出的技巧仍然允许在故事板中设计segue.

对于Xcode的更新版本,肯定@ecotax引入的解决方案以及后来@ShimanskiArtem的更详细的答案是要使用的.


我遇到了和你一样的问题,我找到了以下技巧

假设您有一个navigationController,您希望在其中拥有多个按钮.从iOS 5开始,您可以分配一个数组.问题是您将失去使用故事板的所有好处,因为它将以编程方式完成.

我使用了以下技巧.通常,当您想要导航栏上的多个按钮时,您不需要工具栏.

在要显示按钮的当前视图(不在导航控制器中)中,通过更改显示工具栏

bottomBar =推断到bottomBar =工具栏.

在此输入图像描述

工具栏将显示在底部.将UIBarButtons添加到此栏.使用segues等将它们链接到其他视图控制器......

在.h文件中为每个按钮创建一个插座

@property (strong, nonatomic) IBOutlet UIBarButtonItem *Button1;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *Button2;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *Button3;
Run Code Online (Sandbox Code Playgroud)

然后在viewDidLoad()中将按钮链接到导航栏并隐藏工具栏.按照您要查看的顺序的相反顺序添加它们

self.navigationItem.rightBarButtonItems =
    [NSArray arrayWithObjects:self.Button3, self.Button2, self.Button1, nil];

self.navigationController.toolbarHidden = YES;
Run Code Online (Sandbox Code Playgroud)

并且您的导航栏中有多个按钮

在此输入图像描述

在此输入图像描述

以及模拟器中的结果

在此输入图像描述

在此输入图像描述

  • 一个小改进,恕我直言:使用IBOutletCollection而不是多个IBOutlets. (3认同)

eco*_*tax 15

我想按照HpTerm的建议,但在我的应用程序中,我确实有一个工具栏和一个导航栏.
我发现他/她的评论中概述的方法可以很容易地推广到支持这个案例.您可以通过在下面的黑色栏中拖动按钮,而不是添加虚拟工具栏,只需在与视图控制器相同的级别添加按钮:

在此输入图像描述

或在左侧显示的文字概述中:

在此输入图像描述

在viewDidLoad中将属性分配给数组仍然是HpTerm解释的; 唯一的区别是没有虚拟工具栏可以隐藏了.