【问题标题】:Setting up reused navigation bar item button for left button为左按钮设置重用的导航栏项目按钮
【发布时间】:2013-04-30 17:50:14
【问题描述】:

我在整个应用程序中使用导航栏,尽管不是通过导航控制器(通过情节提要添加到 VC)的控制器。

我想在导航控制器上将左栏按钮项设置为相同,直到它的使用。这是将滑入的菜单的堆栈样式:

按照标准做法实现此按钮的正确方法是什么?我可以将按钮的 bg 剥离为可重复的,这不是问题,但是如何完成以下操作: 1.在按钮内实现图像 2. 如果可能的话,通过外观 API 实现这个按钮,这样代码就不是胶水代码,而是在所有有这个的 VC 上重复使用。

如果我不能通过外观进行操作,那么不必在使用它的控制器中一遍又一遍地包含此代码的最佳方法是什么?

除此之外,有没有办法在情节提要中显示此按钮项并在情节提要中链接/具有视觉以外的用途。

【问题讨论】:

  • 您可以为 viewController 创建一个类别并将该 navBarItem 添加到 navBar。如果您没有使用该按钮进行导航,那么该按钮的预期结果是什么?菜单是否滑入整个栏的下方?您可以将 bar 项的 image 属性用于图像。
  • 是的,菜单正在滑入下方。对于多个 VC 来说也是一样的。我会使用图像属性而不是拉伸图像只是将其用作整个图像吗?它不适用于所有视图控制器,但有 7 个左右会使用它,你还推荐一个类别吗?
  • @MarkM - 你还有其他关于需要什么的信息吗?如何创建类别和方法?
  • 我会使用 CAGradient 创建导航栏,然后将 leftBarItem 设置为您显示的按钮及其图像。您可以将该按钮上的操作设置为在菜单中设置动画,但如果您将其用于导航,则需要在 viewwillAppear 上隐藏 backBarButton,否则它可能会争夺 leftBarButton 的位置(导航控制器在按下后自动添加后退按钮一个看法)。从一个视图开始,然后您可以在获得正确的外观以供重复使用后实例化该类。
  • 谢谢,根据问题,这不是导航控制器堆栈的一部分,因此后退按钮不会成为问题。我发现如何完成这个最好的方法是为导航栏创建一个类,然后将按钮添加到 awakeFromNib 方法,然后我可以在需要时将栏添加到情节提要 VC 中并指向正确的类。我想这就是我一直在寻找的。谢谢@MarkM

标签: ios ios5 uinavigationcontroller uinavigationbar uinavigationitem


【解决方案1】:

啊,好的,现在我跟着你。在这种情况下,只需创建一个自定义 navBar 类并将其添加到您的 pch 然后在必要时使用它,或者创建一个名为“UIViewControllerWithNavBar”的自定义 UIViewController 子类,然后您可以使用该类作为默认 UIViewController 类的替代品。

@interface SomeViewController : UIViewControllerWithNavBar

这将允许您在已添加导航栏的情况下在整个应用程序中重用该类。

【讨论】:

  • 接受为答案,但是我的方法是继承 UINavigationBar 并使用 awakeFromNib 来显示栏
【解决方案2】:

我最近写了一篇关于这个问题的博客文章,但针对的是 rightBarButtonItem。我不确定“返回”功能是否需要调整,但如果有兴趣,这里是博客文章:http://www.codebestowed.com/ios-shared-barbuttonitems/

基本思路是继承UINavigationController,给它一个BarButtonItem属性(下面代码中的self.myButton)并添加类似如下的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.delegate = self;
}

- (void)navigationController:(UINavigationController *)navigationController
    willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (!viewController.navigationItem.rightBarButtonItem) {
        viewController.navigationItem.rightBarButtonItem = self.myButton;
    }
}

博客文章详细介绍了如何在 InterfaceBuilder 中进一步设置,这需要一些技巧(在这个答案中太多了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多