- (void)viewDidAppear:(BOOL)animated
{
[self.navigationController.navigationBar.backItem setTitle:@"anything"];
// then call the super
[super viewDidAppear:animated];
}
如果你想保持后退按钮的形状 .
4
这里解释的解决方案都不适用于我 . 所以我做的是从我来自的场景中删除 Headers ,方法如下:
self.title = @"";
因此,当呈现新场景时,不显示背面文本 .
我绝对同意这根本不是一个明确的解决方案,但是有效,并且没有一个解释为我工作 .
4
对于Swift:
// Rename back button
let backButton = UIBarButtonItem(
title: "Back",
style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
target: nil,
action: nil
)
self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
大多数解决方案都会杀死BackButton的原始样式(左箭头栏按钮),同时添加一个具有所需 Headers 的常用按钮 . 所以保持原始风格有两种方式: 1st:使用我不想做的无证按钮样式(110或类似的东西) . 但是,如果你想要,你可以在stackoverflow上找到如何做到这一点 . 第二:使用我的Trenskow的想法 . 我喜欢它,我使用它有点改变 . 而不是覆盖 - (NSString *) Headers 我've decided to keep the original title in the following way (which allows me to use nib'的 Headers 以及推送状态btw的给定 Headers .
30 回答
如果您不仅希望将“后退”按钮的文本更改为相同的文本并保持原始的左箭头形状,而且还要在用户单击“后退”按钮时执行某些操作,我建议您查看我的“CustomNavigationController” .
问题:导航栏中的“后退”文本无法替换 .
原因:推送视图后,导航栏中设置了“返回”标签,因为父视图控制器中的.title属性设置为nil(或未初始化) .
一个解决方案:如果您设置self.title =“Whatever ...”,您将看到在推动新视图控制器后,而不是“Back”将显示“Whatever ...” .
这应该放在调用 Headers 为“NewTitle”的ViewController的方法中 . 就在push或popViewController语句之前 .
在ChildVC中,这对我有用......
也适用于Swift!
以下是 backBarButtonItem 的文档:
查看控制器A( "parent" 视图控制器):
当任何其他视图控制器B位于导航堆栈的顶部,并且A位于其下方时,B的后退按钮将具有 Headers "Short" .
在Xcode 4.5中使用storyboard,到目前为止,当Back按钮的值不必动态更改时,我发现最简单的解决方案是使用与View Controller的导航项相关联的“Back Button”字段想要“后退”按钮说出别的话 .
例如在下面的屏幕截图中,我想要视图控制器的后退按钮,我推动将“后退”作为后退按钮的 Headers .
当然,如果你需要后退按钮每次都说一些略微不同的东西,这将不起作用......这里有所有其他解决方案 .
我知道,问题很老,但我找到了一个很好的解决方案 .
从childView工作!经过iOS 7测试 .
也许我过于简单,但从Apple的文档中可以看出:
上面标记为正确的解决方案从父控制器设置默认按钮项 . 它通过在将新控制器推送到NavigationController堆栈之前更改UIViewController的
self.title
属性来解决问题 .这会自动更新下一个控制器上的后退按钮的 Headers ,只要你将
self.title
设置回viewWillAppear
中的内容,我就看不到这种方法造成太多问题了 .这项工作对我来说更好 . 试试:
在Swift / iOS8中,以下内容对我有用:
来自费利佩的回答 .
好的,这是方法 . 如果你有一个视图控制器“第一”,你通过按下按钮等导航另一个视图控制器“秒”,你需要做一些工作 . 首先,您需要在“第二”视图控制器的ViewDidLoad方法中创建一个BarButtonItem,如下所示;
执行此操作后,您需要在同一个.m文件中写入“btnBack”操作的代码;
就这样 .
使用下面的代码行:
我有一个父视图控制器, Headers 很长 . 这导致后退按钮文本渗透到子视图控制器的 Headers 中 .
在尝试了一堆不同的解决方案之后,这就是我最终做的事情(扩展@ john.k.doe方法):
使用Xcode 7.2,Swift 2
Navigation Item
添加到 Parent View Controller场景(不是子VC)Navigation Item
的Attributes Inspector
上,在Back Button
字段中键入space
字符 . 稍后会详细介绍 .片段:
Explanation:
后退按钮排序属于父视图控制器 .
Navigation Item
为您提供了后退按钮的句柄,因此您可以在代码或故事板中设置 Headers .Note:
如果将
Navigation Item
Back Button
文本保留为默认空字符串,则后退按钮 Headers 将变为"Back" .Other approaches work, why use this one?:
虽然可以覆盖子视图控制器上的后退按钮 Headers ,但是在它已经在屏幕上短暂闪烁之前获取它是一个挑战 .
一些方法构造一个新的后退按钮并覆盖现有的后退按钮 . 我确信它有效,在某些用例中可能是必要的 . 但我更愿意尽可能利用现有的API .
在某些情况下,更改父视图控制器的
title
是最快的解决方案 . 但是,这会更改父 Headers ,因此您必须管理状态 . 事情也变得混乱Tab Bar Controller
因为 Headers 更改会导致Tab Bar Item
Headers 出现副作用 .对于那些使用故事板的人,只需选择父级(不是持有目标视图的那个)视图控制器框架(确保在导航栏上单击右键,然后打开属性检查器,您将在其中找到三个表单输入 . 第三个“后退按钮“是我们正在寻找的 .
Swift版本:
在您的孩子ViewController中:
这是另一种方法 .
在父视图控制器中,实现以下方法:
在子视图控制器中,当您想要更改 Headers 时,这将起作用:
我无法让
parentViewController
属性工作:我没有't know if that'是一个错误,或者我没有正确使用它 . 但 grab
viewControllers
数组中倒数第二个视图控制器指向父视图控制器,我可以使用该引用正确调用父方法 .好 . 我个人讨厌所有这些选择 . 所以我想出了自己的 .
根据我看到的信息 . 看起来,前一个视图控制器控制着自己的“后退”按钮,该按钮将在推动的视图控制器上显示 .
我为需要更改后退按钮的控制器上的navigationItem创建了一个Lazy Load方法 .
我是一名邀请买家控制员
Invite Buyer是默认设置的文本 .
但后退按钮必须是邀请
这是我用来创建后退按钮的代码 .
我将此代码放在Controller的Implementatio(.m)文件的顶部,它自动覆盖了super的方法 .
我觉得这是一种更优雅的方式来实现这一目标 .
我将此代码放在一个位置,并在需要时自动填充 .
无需在每个推送请求之前调用代码 .
希望这可以帮助
这是答案:
在
viewDidAppear:animated
(不在viewDidLoad
中)执行以下操作如果你想保持后退按钮的形状 .
这里解释的解决方案都不适用于我 . 所以我做的是从我来自的场景中删除 Headers ,方法如下:
self.title = @"";
因此,当呈现新场景时,不显示背面文本 .
我绝对同意这根本不是一个明确的解决方案,但是有效,并且没有一个解释为我工作 .
对于Swift:
我发现,更改后退按钮名称的最简单方法是将视图控制器 Headers 设置为后退按钮的 Headers ,然后将视图控制器导航项中的titleView替换为自定义标签 . 名称 .
像这样:
CustomViewController.m
这将使您在UINavigationBar中的 Headers 看起来好像是原生的 . 赋予视图控制器分离 Headers 和后退按钮 Headers 的能力 .
在视图控制器A和B的情况下,A负责告知它的后退按钮应该如何显示,同时显示B.
编辑:这也保持后退按钮本机外观(左箭头栏按钮项) .
这段代码也有效 . 把它放在导航控制器的根控制器上:
我发现在推送到下一个视图控制器之前,最好将导航堆栈中当前视图控制器的 Headers 更改为后退按钮的所需文本 .
例如
然后在viewDidAppear中将 Headers 设置回原始VC的所需 Headers . 瞧!
我是iOS的新手,但我将提供覆盖导航控制器类的非常简单的答案 . 我有简单的覆盖push和pop方法并保存以前的视图控制器的 Headers . 很抱歉在js块粘贴 . 有点困惑如何在正常的代码块中过去它 .
self.navigationController.navigationBar.backItem.title = @"TEXT";
在斯威夫特:
您可以在parrent控制器的代码中将它放在您喜欢的位置,这样您就可以为不同的子视图设置不同的背景按钮 .
大多数解决方案都会杀死BackButton的原始样式(左箭头栏按钮),同时添加一个具有所需 Headers 的常用按钮 .
所以保持原始风格有两种方式:
1st:使用我不想做的无证按钮样式(110或类似的东西) . 但是,如果你想要,你可以在stackoverflow上找到如何做到这一点 .
第二:使用我的Trenskow的想法 . 我喜欢它,我使用它有点改变 .
而不是覆盖 - (NSString *) Headers 我've decided to keep the original title in the following way (which allows me to use nib'的 Headers 以及推送状态btw的给定 Headers .
此解决方案效果很好,看起来很原生 . 此外,如果在viewDidLoad方法中使用它,它会阻止执行超过1次 .
我也是解决方案,但看起来很糟糕 . 它会导致用户 Headers 栏的可见性从原始状态变为BackButton的所需和返回 .
这对我来说是以前发布的答案的“简化”版本 .
请记住将代码放在父视图中控制器(例如具有您的表视图或UITableViewController的视图), not 子视图或详细视图(例如UIViewController) .
您可以轻松地本地化后退按钮字符串,如下所示:
斯坦的回答是最好的 . 但它也有一个问题,当你使用带有标签栏的控制器并更改控制器的 Headers 时,你也可以更改标签栏的 Headers . 所以最好的答案是只更改view_controller.navigationItem.title并使用view_controller.navigationItem .title在函数中 . 答案在这里:(使用ARC并将它们添加到视图的viewDidLoad中)
在我自己的使用中,我使它成为这样的函数,只需在viewDidLoad中使用一行代码 .