在 navigationController 中有一个通用栏按钮项

Posted

技术标签:

【中文标题】在 navigationController 中有一个通用栏按钮项【英文标题】:have a universal bar button item in navigationController 【发布时间】:2014-02-28 13:43:13 【问题描述】:

我在我的应用程序中有UINavigationController,我希望在我的应用程序中出现的所有导航栏中显示一个正确的UIBarButtonItem。这个按钮会加载菜单,所以我不想在每个导航栏中手动添加这个按钮,因为这个功能是加载菜单,我不想复制/过去这个按钮的动作。

ViewController.h.m 有没有办法处理这个问题?

所以按钮充当通用栏按钮项?

【问题讨论】:

@Virussmca ***.com/questions/3029959/… @sbarow:从ios6你可以继承它***.com/a/15893523/1597744 【参考方案1】:

您可以做的是子类化导航控制器。这是一个例子

@interface NavigationController : UINavigationController
@end

@interface NavigationController () <UINavigationBarDelegate>
@end

@implementation NavigationController

- (void)viewDidLoad

    [super viewDidLoad];
    for (UIViewController* viewController in self.viewControllers)
        // You need to do this because the push is not called if you created this controller as part of the storyboard
        [self addButton:viewController.navigationItem];         
    


-(void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    [self addButton:viewController.navigationItem];
    [super pushViewController:viewController animated:animated];


-(void) addButton:(UINavigationItem *)item
    if (item.rightBarButtonItem == nil)
        item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(action:)];
    


-(void) action:(UIBarButtonItem*) button



@end

【讨论】:

太棒了,我搜索了4个多小时,没有运气,最后你的回答对我有帮助,谢谢。【参考方案2】:

除非您使用自定义视图看起来像 NavigationBar,否则无法做到这一点。 默认情况下,当 ViewController 被推入或弹出时,NavigationController 会清除所有条形按钮项。所以对于每一个ViewController,每次都需要在函数中创建UIBarButtonItem

- (void)viewWillAppear:(BOOL)animated

或者可以使用 UINavigationController 的子类并按照@rp90 的回答。

【讨论】:

【参考方案3】:

您可以通过将按钮添加到 UINavigationController 的委托中来添加显示在 UINavigationController 中的按钮 - 在本例中,是一个单例帮助程序类。

斯威夫特 3:

class NavHelper: UINavigationControllerDelegate 
    static let shared = NavHelper()

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) 
        let barButtonItem = UIBarButtonItem(image: <yourButtonImage>, style: .plain, target: NavHelper.shared, action: #selector(NavDelegate.handleButton(_:)))
        viewController.navigationItem.rightBarButtonItem = barButtonItem
    

    func handleButton(_ sender: UIBarButtomItem) 
        <yourCode>
    

【讨论】:

【参考方案4】:

另一种选择是将您自己的导航栏视图作为 UIViewController 的一部分。您可以关闭 Apple 并构建自己的。我们这样做是为了更容易地提供我们自己的控件。你唯一失去的是 iOS 7 下的简单半透明。很多应用程序这样做的原因与我们相同。

【讨论】:

【参考方案5】:

您可以创建一个继承自UIViewController 的新类,并在viewDidLoad 方法中创建一个UIBarButtonItem 并将其作为左/右栏项添加到navigationItem。假设这个类被称为CustomBarViewController

UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithTitle:@"hi" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:)];
[self.navigationItem setRightBarButtonItem:barItem];

在您现有的视图控制器中,您可以让它们使用 CustomBarViewController,而不是让它们从 .h 文件中的 UIViewController 继承:

@interface MyExistingViewController : CustomBarViewController

然后您可以将操作放入doSomething: 方法中,或者让它将通知传递给您现有的视图控制器。

【讨论】:

【参考方案6】:

您可以将按钮添加到 ContainerView 中。因此它将始终处于开启状态。 值得深思……

【讨论】:

以上是关于在 navigationController 中有一个通用栏按钮项的主要内容,如果未能解决你的问题,请参考以下文章

navigationController 在 swift 中为零

self.navigationController 在 swift 中为零

阻止用户返回 NavigationController

NavigationController 和 View Hierarchy 问题

没有 NavigationController 的 iAd 多视图

如何在 tableview 搜索栏中获取对 navigationcontroller 的引用?