UINavigationBar可编辑标题?

13

我有一个基于UINavigationController的应用程序。我可以在我的视图控制器的viewDidLoad方法中编程设置UINavigationBar的标题:

self.navigationItem.title = m_name;

我能否使导航栏标题可编辑?例如,我希望用户能够轻触导航栏中的标题并对其进行编辑。

这个是否可能呢?如果可能的话,它是否符合苹果的人机界面指南?(本文建议可以,但没有告诉我如何实现-Make UINavigationBar title editable

非常感谢

Nathan

7个回答

20

您可以设置自定义视图来显示标题。

titleView

当接收器是顶部项时,在导航栏中心显示的自定义视图。

@property(nonatomic, retain) UIView *titleView

讨论

如果此属性值为nil,则在接收器是顶部项时,导航栏中心显示导航项的标题。如果将此属性设置为自定义标题,则显示该自定义标题而非标题。如果leftBarButtonItem不为nil,则忽略此属性。

自定义视图可以包含按钮。使用UIButton类中的buttonWithType:方法将按钮添加到样式与导航栏相同的自定义视图中。自定义标题视图位于导航栏中心,并可以调整大小以适应。

如果您将UITextField放置在titleView中,您可以将其背景设置为clearColor并将其边框设置为无。这样,您就可以轻松地编辑UINavigationBar标题了。


1
感谢您的回答,Ryan。对于这个答案我给一个+1,并且也喜欢您用 “voila” 做拼写的搞笑方式 : )。祝好! - Nathan Russell
2
哈哈,我很高兴能够同时帮助你并犯下语法错误。 :) 祝编码愉快。 - Ryan Poolos
有人知道如何使用可变宽度来实现这个吗?如果我旋转我的设备,我希望文本框的宽度能够像标题标签一样改变。 - Mark Bridges
似乎没有太多好的方法。但是在底部附近有一行代码可能适用于特定情况,否则需要手动调整框架来进行旋转。 - Ryan Poolos

13

Ryan的解决方案完全正确。如果有人在实现过程中遇到问题,这里提供一些示例代码,应该能帮助你入门。只需将其粘贴到具有navigationController的任何类的ViewDidLoad中即可。

UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 22)];
textField.text = @"Insert Title Here";
textField.font = [UIFont boldSystemFontOfSize:19];
textField.textColor = [UIColor whiteColor];
textField.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView = textField;

如果您的项目不使用ARC,请确保像这样释放textField:

UITextField *textField = [[[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 22)]autorelease];

或者像这样:

[textField release];

希望这能有所帮助。


你如何动态调整大小? - Zorayr

2

Ryan的Swift解决方案

let textField = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 22))
textField.text = "Title"
textField.font = UIFont.systemFontOfSize(19)
textField.textColor = UIColor.whiteColor()
textField.textAlignment = .Center
self.navigationItem.titleView = textField

1

这是Ciprian's code的Swift 4版本,已经修正适用于iOS 12:

let textField = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 21))

textField.text          = "Your Title"
textField.font          = UIFont.systemFont(ofSize: 17, weight: .semibold)
textField.textAlignment = .center

self.navigationItem.titleView = textField

0

您可以将文本字段放置在导航栏的顶部,并将其设置为隐藏/未启用。然后使用手势识别器来检测导航栏上的轻击,并将文本字段设置为启用/不隐藏。然后在文本字段的编辑结束方法中,再次将其设置为隐藏,并将导航栏的标题设置为文本字段的标题。


0
在导航栏上添加一个隐藏的文本框,这样在点击时,它会弹出一个键盘,用户可以在其中输入文本。
获取返回按钮事件,在那里您可以使用新添加的文本更改导航栏文本。然后再次隐藏文本框。
享受编码 :)

0
在NavigationBar上放置一个textField,并将textField的背景颜色的不透明度设置为零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接