我现在查看了有关从UINavigationBar上的后退按钮中移除文字的帖子的TONS。他们似乎不再工作(iOS 10+)。即使他们这样做了,他们也不会闻到正确的#34; ......
我的问题是,为什么这不起作用?
class MyViewController: UIViewController {
private var _navItem: UINavigationItem? = nil
override var navigationItem: UINavigationItem {
if _navItem == nil {
let item = super.navigationItem
let backBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: nil, action: nil)
backBarButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
backBarButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
item.backBarButtonItem = backBarButtonItem
_navItem = item
}
return _navItem!
}
//...
}
我希望看到一个包含明文的按钮,但我将前一个视图控制器的标题看作后退按钮文本。
我是否需要继承UINavigationController
?或者弄乱UINavigationBarDelegate
?
答案 0 :(得分:1)
这是一个非常常见的混淆点,因为API在其表面上有点违反直觉。 documentation that explains它也有点复杂
当此导航项位于堆栈顶部项目的正下方时,导航控制器将从此导航项目中导出导航栏的后退按钮。当此属性为nil时,导航项使用其title属性中的值来创建适当的后退按钮。
基本上,您需要在“上一个视图控制器”上执行此操作,而不是在后面的按钮上执行此操作。
虽然我不确定你的总体目标是什么,但要“应用程序范围”,你有几个选择。
将此项放入整个项目的某种全局基本视图控制器类中。如果您希望为应用程序的不同部分提供不同的基类,当然还有处理不同类型的系统控制器时,这一点特别麻烦。
UIAppearance方法,它们具有影响每个单个按钮项目(包括后退按钮)的缺点(或上升?)。这种解决方案通常过于宽泛,但无可否认是全球性的。
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
在顶视图控制器上提供您想要后退按钮的自定义左侧栏按钮项。这个解决方案再次需要基类,或良好的'ol copy-pasta。当然,失去了为你提供系统后卫雪佛龙的能力。另一种选择是延伸(加布里埃尔的回答提供了一个可爱的例子)。
一切都有权衡。
答案 1 :(得分:0)
虽然艾伦的回答是正确的,但您需要在“之前的视图控制器”上执行此操作,而不是您看到后退按钮的那个。
虽然你也可以在同一个控制器上实现你的目标,但这是我的解决方案,
此功能将返回UIBarButtonItem
:
UIBarButtonItem *bbBack = [self overrideBackBarButtonItemWithTarget:self action:@selector(btnBackTapped:)];
在当前控制器的某个位置实现选择器:
- (IBAction)btnBackTapped:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}
功能:
-(UIBarButtonItem*)overrideBackBarButtonItemWithTarget:(nullable id)target action:(nullable SEL)action {
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 65 , 44)];
[btn setImage:[UIImage imageNamed:@"nav-back"] forState:UIControlStateNormal];
btn.imageEdgeInsets = UIEdgeInsetsMake(0, -15, 0, 15);//move image to the right
[btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barbuttonBack = [[UIBarButtonItem alloc] initWithCustomView:btn];
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spacer.width = -15;
UIViewController *_self = (UIViewController*)target;
[_self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:spacer,barbuttonBack, nil] animated:NO];
return barbuttonBack;
}
答案 2 :(得分:0)
应归功于Allen Humphreys,但我上面发布的问题确保他们在后退按钮上没有文字,但您必须确保所有视图控制器都继承此类。
它似乎没有做任何事情,因为我认为设置backButton文本是为了当视图控制器本身是当前在堆栈中可见的那个时,但它实际上意味着什么是"什么是当此视图控制器从顶部开始倒数时,返回按钮标题?"
我的问题出现了,因为视图控制器排在第二位。没有使用这个重写的navigationItem。
答案 3 :(得分:0)
我遇到了完全相同的问题,想要使用没有文字的图标,文字一直显示出来。经过长时间的搜索和大量尝试后,我不得不求助于创建自定义按钮并将其设置为leftBarButtonItem。 这是相关的代码:
{{1}}
仅使用removeBackButton(),因为我有一个不应该有后退按钮的弹出窗口,所以我将其删除。