在 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 和 View Hierarchy 问题