如何在没有标题的情况下自定义iOS 7及更高版本中的导航后退按钮? (即仅用箭头)
self.navigationItem.leftBarButtonItem = self.editButtonItem;
我只是想知道他们是否有任何self.backButtonItem;
OR
这样的事情?
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemBACK
target:self action:@selector(back)];
答案 0 :(得分:305)
实际上很简单,这就是我的工作:
目标C
// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
Swift 2
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
Swift 3
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
将此行放在正在推送到堆栈的视图控制器中( 以前的视图控制器 )。新推的视图控制器后退按钮现在将显示您为initWithTitle添加的内容,在本例中为空字符串。
答案 1 :(得分:195)
我找到了一种简单的方法,可以使用iOS单箭头制作我的后退按钮。
让我们假设你有一个导航控制器从ViewB转到ViewA。在IB中,选择ViewA的导航栏,您应该看到以下选项:标题,提示和后退按钮。
ViewA导航栏选项
诀窍是在上一个视图控制器(视图A)的选项中选择您的命运视图控制器后退按钮标题(ViewB)。如果您未填写“后退按钮”选项,iOS将自动将标题设置为“返回”,并使用上一个视图控制器的标题。因此,您需要使用单个空格填充此选项。
在“后退按钮”选项中填写空格
结果:
答案 2 :(得分:65)
只需使用图片!
<强> OBJ-C 强>:
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
style:UIBarButtonItemStylePlain
target:self.navigationController
action:@selector(popViewControllerAnimated:)];
self.navigationItem.leftBarButtonItem = backButton;
}
SWIFT 4 :
let backBTN = UIBarButtonItem(image: UIImage(named: "Back"),
style: .plain,
target: navigationController,
action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self
图标-Back.png
Icon-Back@2x.png
Icon-Back@3x.png
答案 3 :(得分:28)
iOS7有新的界面规则,因此在推送UIView时最好至少保留后退箭头。 以编程方式更改“后退”文本非常容易。只需在推送视图之前添加此代码(如果您使用的是StoryBoards,则添加prepareForSegue):
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}
这将更改默认的“返回”文本,但会保留iOS7样式的后退箭头。 您还可以在推动视图之前更改后退箭头的色调颜色:
- (void)viewDidLoad{
//NavBar background color:
self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}
希望这能帮到你!
答案 4 :(得分:26)
你无需做什么。您可以通过故事板本身实现相同的目标。
只需转到根导航控制器并给出一个空格。切记不要控制器你想要没有标题的后退按钮,而是根据导航控制器。
答案 5 :(得分:22)
虽然Kyle Begeman's answer完全可以解决问题,但是在每个视图控制器中都可以使用这些代码是非常烦人的。我最终得到了一个简单的UINavigationItem
类别。小心,这里是龙!对不起,我的意思是,调情:
#import <objc/runtime.h>
@implementation UINavigationItem (ArrowBackButton)
static char kArrowBackButtonKey;
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
method_exchangeImplementations(m1, m2);
});
}
- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
if (item) {
return item;
}
item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
if (!item) {
item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return item;
}
@end
答案 6 :(得分:21)
编辑:2014-04-09:当我获得声誉时,我感到很抱歉,因为我不再使用这个技巧了。我推荐Kyle的回答。另请注意,self
self.navigationItem.backBarButtonItem
不是视图控制器,后退按钮显示,但前一个视图控制器将返回。
如果您不需要为前一个视图控制器提供标题文本,只需用空白字符串填充标题;
self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];
这将阻止在推动的视图控制器上显示带有V形符号的“后退”。
编辑:即使您使用非空白标题文本,在viewWillAppear:
中设置上一个视图控制器的标题仍可正常工作,但视图控制器弹出时标题会闪烁闪烁。我认为“推特应用程序”似乎做了更微妙的黑客以避免闪烁。
答案 7 :(得分:20)
这样可以,但它会删除上一个项目的标题,即使你弹回它:
self.navigationController.navigationBar.topItem.title = @"";
只需在推送的View Controller的viewDidLoad
上设置此属性即可。
答案 8 :(得分:9)
我就是这样做的,也是最简单,最有效,最清晰的方法。
如果嵌入Navigation Controller
Swift 3
在viewDidLoad
中,我将此添加到视图控制器,您希望后退按钮只是箭头。
if let topItem = self.navigationController?.navigationBar.topItem {
topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
这与@Kyle Begeman的答案的不同之处在于,您在视图控制器上调用此选项,您希望后退按钮只是箭头,而不是推送堆栈视图控制器。
答案 9 :(得分:6)
来自iOS6的简单黑客也适用于iOS7:
[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
修改强> 不要使用这个黑客。有关详细信息,请参阅评论。
答案 10 :(得分:6)
您无法按照自己的方式访问导航backButtonItem,您需要创建自己的后退按钮,如下所示:
- (void)loadView
{
[super loadView];
UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
[backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}
当然:
- (void) popVC{
[self.navigationController popViewControllerAnimated:YES];
}
答案 11 :(得分:6)
:定位:强> 的
将UINavigationBar
上的所有后退按钮自定义为白色图标
的步骤:强> 的 1.在AppDelete的“didFinishLaunchingWithOptions”方法中:
UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
[UINavigationBar appearance].tintColor = [UIColor whiteColor];
[UINavigationBar appearance].backIndicatorImage = backBtnIcon;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{
UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}
2.在普通超级viewDidLoad
类的ViewController
方法中:
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[self.navigationItem setBackBarButtonItem:backItem];
}else{
//do nothing
}
答案 12 :(得分:3)
你可以用它。只需添加UIButton
作为UIBarButtonItem
的custumview,这对我来说非常有用。
尝试以下代码
self.navigationItem.leftBarButtonItem=[self backButton];
- (UIBarButtonItem *)backButton
{
UIImage *image = [UIImage imageNamed:@"back-btn.png"];
CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);
UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
[button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
[button setImage:image forState:UIControlStateNormal];
UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
答案 13 :(得分:3)
所有答案都没有解决问题。在每个视图控制器中设置后退按钮标题是不可接受的,并且向标题添加偏移量仍会使下一个视图控制器标题向右移动。
以下是使用方法调配的方法,只需为UINavigationItem创建新的扩展
import UIKit
extension UINavigationItem {
public override class func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
// make sure this isn't a subclass
if self !== UINavigationItem.self {
return
}
dispatch_once(&Static.token) {
let originalSelector = Selector("backBarButtonItem")
let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
// MARK: - Method Swizzling
struct AssociatedKeys {
static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}
func noTitleBackBarButtonItem() -> UIBarButtonItem? {
if let item = self.noTitleBackBarButtonItem() {
return item
}
if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
return item
} else {
let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return newItem
}
}
}
答案 14 :(得分:3)
SWIFT 4
对于那些希望创建自定义后退按钮并删除其标题的用户,请在视图控制器中使用以下代码推送新代码:
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
要更通用,请执行以下操作:
创建通用函数,如下所示:
func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
然后按如下所示在视图控制器中使用它:
addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
答案 15 :(得分:2)
将标题设置为空
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];
更改背面图像
UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;
答案 16 :(得分:2)
您可以继承UINavigationController,将其自身设置为委托,并在委托方法navigationController:willShowViewController:animated:
@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>
@end
@implementation Custom_NavigationController
- (void)viewDidLoad
{
[super viewDidLoad];
self.delegate = self;
}
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
答案 17 :(得分:2)
使用您想要的根视图控制器的标题创建UILabel
,并将其分配给视图控制器的navigationItem.titleView
。
现在将标题设置为空字符串,然后您推送的下一个视图控制器将有一个没有文本的后退按钮。
self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
答案 18 :(得分:2)
// add left bar button item
try this code:
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
CGRect backframe = CGRectMake(250, 9, 15,21);
UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
[backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
[backbutton addTarget:self action:@selector(Btn_back:)
forControlEvents:UIControlEventTouchUpInside];
[backbutton setShowsTouchWhenHighlighted:YES];
UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
self.navigationItem.leftBarButtonItem=backbarbutton;
[backbutton release];
}
-(IBAction)Btn_back:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
答案 19 :(得分:1)
您可以在viewWillDisappear上将当前ViewController的标题更改为@“”,然后在再次显示该标题时将其重置为以前的名称。
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.title = @"Previous Title";
}
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.title = @"";
}
答案 20 :(得分:1)
我在viewDidLoad中应用了以下代码,它可以工作:
// this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";
// this line set the back button and default icon color
//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];
this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];
只是为了更新我使用矢量图标
答案 21 :(得分:1)
我从iOS 5开始使用这个解决方案没有任何问题。我做了一个实用功能,我在视图控制器中调用。您需要在viewDidLoad或之后的任何点执行此操作。
void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
if(! viewController.navigationItem.backBarButtonItem)
{
viewController.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:text
style:UIBarButtonItemStylePlain
target:nil action:nil];
}
else
{
viewController.navigationItem.backBarButtonItem.title = text;
}
}
在某些情况下,导航项可能已经存在,在其他情况下需要创建。这可以解决这两种情况,而不会弄乱导航项目标题。它允许您通过传递@""
来删除标题。
答案 22 :(得分:1)
对我有用的唯一方法是:
navigationController?.navigationBar.backItem?.title = ""
更新:
当我将segue动画标志更改为true(之前为假)时,对我有用的唯一方法是:
navigationController?.navigationBar.topItem?.title = ""
答案 23 :(得分:1)
如果您有两个ViewController(FirstVC,SecondVC)嵌入导航控制器,并且您希望SecondVC中只有后退箭头。
你可以试试这个 在FirstVC的ViewDidLoad
中override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
然后当你进入SecondVC时,你会看到只有后退箭头
答案 24 :(得分:1)
如果设置tintColor Of NavigationBar,请添加不带标题的自定义后退按钮图像,色调颜色将反映图像颜色。请关注此苹果文档链接。
UINavigationItem *navItem = [[UINavigationItem alloc] init];
navBar.tintColor = self.tintColor;
UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
myImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
navItem.leftBarButtonItem = leftButton;
navBar.items = @[ navItem ];
答案 25 :(得分:1)
检查此答案
How to change the UINavigationController back button name?
将title
文字设为string
,空格如下所示
title = " "
没有足够的声誉来添加评论:)
答案 26 :(得分:0)
在第一个ViewController的prepareForSegue:方法中,您将标题视图设置为@“”,因此当按下下一个视图时,它将显示以前的ViewController标题,该标题将为@“”。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
唯一的问题是,当您点击后退按钮时,您之前的视图将没有标题,因此您可以在viewWillAppear上再次添加它:
-(void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
我不太喜欢这个解决方案,但它有效,我没有找到其他方法来做到这一点。
答案 27 :(得分:0)
backItem.title = ""
更改为使用topItem.title = ""
navigationItem.hidesBackButton = true
和navigationItem.leftBarButtonItem
将丢失后退手势我的解决方案将更改图像并保持后退手势:
navigationController?.navigationBar.backIndicatorImage = UIImage(named: "back")
navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "back")
navigationController?.navigationBar.topItem?.title = ""
答案 28 :(得分:0)
我写了一个扩展程序,以便更轻松:
extension UIViewController {
/// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
@objc var backButtonTitle: String? {
get {
return navigationItem.backBarButtonItem?.title
}
set {
if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
existingBackBarButtonItem.title = newValue
}
else {
let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
navigationItem.backBarButtonItem = newNavigationItem
}
}
}
}
答案 29 :(得分:0)
将按钮项目标题设置为空字符串。
[self.navigationController.navigationBar.backItem setTitle:@&#34;&#34;];
答案 30 :(得分:0)
您可以将该类别放在AppDelegate.m文件中。
从UINavigation中的所有默认后退按钮中删除 text 。只有箭头“&lt;”或者如果需要,设置自定义图像。
目标-C:
...
@end
@implementation UINavigationItem (Extension) - (UIBarButtonItem *)backBarButtonItem { return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end
答案 31 :(得分:0)
答案 32 :(得分:0)
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Custom initialization
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
return self;
}
就像Kyle Begeman一样,你在根视图控制器上添加上面的代码。将应用所有子视图控制器。另外,在initWithCoder:方法中添加它,您可以在xib,storyboard或基于代码的方法中应用根视图控制器的样式。
答案 33 :(得分:0)
要添加到上面的Thomas C's answer,有时单个空格不起作用,您必须不断添加空格。
当你在“导航项目”下看到“栏按钮项目 - ”时,你会知道你成功了。这是在文档大纲(编辑器 - >显示文档大纲)中。看到上面的图片后,您可以删除一些空格,看看它是否仍然有效。
答案 34 :(得分:-1)
这适用于iOS6和7
Xamarin(C#)选项
var buttonStyleItems = UIBarButtonItem.AppearanceWhenContainedIn(typeof(SettingsNavigationController));
buttonStyleItems.SetBackButtonTitlePositionAdjustment(new UIOffset(-1000, -1000), UIBarMetrics.Default);
Objective-C选项
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]
;
答案 35 :(得分:-1)
我正在修改消失的视图标题
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
title = "My title"
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
title = " "
}
答案 36 :(得分:-1)
这对我来说很有把戏
[[UIBarButtonItem appearance]
setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000)
forBarMetrics:UIBarMetricsDefault];
一切顺利