【问题标题】:Change BackBarButtonItem for All UIViewControllers?更改所有 UIViewControllers 的 BackBarButtonItem?
【发布时间】:2016-01-13 17:32:54
【问题描述】:

我想更改我 iOS 应用程序中所有视图上的 BackBarButtonItem,以便它们只显示没有文字的后退箭头。

实现这一点的唯一方法是遍历每个 UIViewController 并设置 self.navigationItem.backBarButtonItem.title 吗?似乎我应该能够创建一个超类来定义backBarButtonItem.title 的默认值,但我不知道从哪里开始。

感谢您的帮助。

【问题讨论】:

  • 你试过 UIViewController 上的分类了吗?
  • 我想如果我做一个类别,我会将该类别#import 到每个导航控制器中,对吗?我目前正在研究 Swizzling。
  • 不,你不需要#import它。
  • 你能告诉我更多关于这方面的信息吗?我将如何实现它以影响所有BackBarButtonItems,而不必在每次应用程序创建新的后退按钮时调用我的类别方法?
  • 如果您在 UIViewController 上创建一个类别并在其中覆盖backBarButtonItem,那么只要调用它们的后退栏按钮项,就会调用您的方法。如果你想调用超类方法,你只需要 swizzle。

标签: ios objective-c uiviewcontroller uinavigationitem backbarbuttonitem


【解决方案1】:

您不需要在每个视图控制器类上更改它。您可以将其子类化并更改一次,也可以在您的应用委托中进行。

如果你想子类导航栏,你可以简单地设置带有文本@“”的后退按钮:

  UIBarButtonItem *newBackButton = 
  [[UIBarButtonItem alloc] initWithTitle:@"" 
                                     style:UIBarButtonItemStylePlain 
                                    target:nil 
                                    action:nil];
  [[self navigationItem] setBackBarButtonItem:newBackButton];

如果您想在应用代理中执行此操作,您可以通过两种方式执行此操作:

一种方法是将按钮文本颜色设置为透明色:

[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor clearColor]} forState:UIControlStateNormal];

另一种方法是将后退按钮放置在远离屏幕的位置,这样用户就看不到它

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -200) forBarMetrics:UIBarMetricsDefault];

【讨论】:

  • [UIBarButtonItem appearance] 属性不会导致所有导航栏按钮(而不仅仅是 back 按钮)隐藏其标题吗?
  • 是的,你是对的,那是因为我没有提到那行代码的后退按钮。如果您正在使用外观,那是目前可用的两种方式。 Apple 需要更新 API 以使用外观设置返回按钮标题。
  • 你有 Swift 版本吗?我正在尝试翻译,但无法实现。
【解决方案2】:

我们可以实现导航控制器的委托功能,并为实现该功能的视图控制器设置委托:

1) navigationController.delegate = yourViewController

2) 委托功能:

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

这将删除所有后续视图控制器的后退按钮标题文本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多