Swift 3.0 向导航栏添加右键按钮
Swift 3.0 Adding a Right Button to Navigation Bar
我在视图控制器的顶部添加了一个导航栏。我试图根据条件控制按钮是否可见,但添加按钮时遇到问题。到目前为止,
var addButton: UIBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
override func viewDidLoad() {
super.viewDidLoad()
let boool = true
if boool {
self.navigationItem.rightBarButtonItem = self.addButton
}
else {
self.navigationItem.rightBarButtonItem = nil
}
}
func addTapped(sender: AnyObject) {
print("hjxdbsdhjbv")
}
我认为它无法正常工作,因为我在 VC 中添加了一个导航栏,而不是使用导航控制器并在那里使用该栏。我想知道是否有办法使用这个导航栏。
您说您通过情节提要向您的视图控制器添加了一个 UINavigationBar
,但是查看您提供的代码,在 IB 中没有与您的导航栏的出口连接。
为了访问 self.navigationItem
,您的视图控制器必须嵌入 UINavigationController
或成为层次结构的一部分。除非您需要在单个视图控制器上使用自定义导航栏,否则我建议将其从 Interface Builder 中删除,然后确保有问题的视图控制器嵌入到 UINavigationController
中或将其推送到导航中从另一个嵌入导航控制器的控制器堆栈,然后你应该看到你的 UIBarButtonItem
.
首先,您需要将导航栏连接到 IBOutlet,以便您可以在代码中引用它。之后,此代码应该可以工作:
let navigationItem = UINavigationItem(title: "Title")
navigationItem.rightBarButtonItem = self.addButton
navigationItem.hidesBackButton = true
self.navigationBar.pushItem(navigationItem, animated: false)
很简单。把这行代码放到 viewDidLoad
:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
已更新 Swift 4 或更高版本:
自定义函数:
@objc func action(sender: UIBarButtonItem) {
// Function body goes here
}
(自定义)右栏按钮项:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
(自定义)左栏按钮项:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
您也可以像这样添加系统栏按钮项目:UIBarButtonItem.SystemItem
为栏按钮项目定义系统提供的图像:.add, .done, .取消、.edit、.save、.compose、.reply、.organize 等等。
(系统)右栏按钮项:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
(系统)左栏按钮项:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
let rightBarButtonItem = UIBarButtonItem.init(image: UIImage(named: "EditImage"), style: .done, target: self, action: #selector(ViewController.call_Method))
self.navigationItem.rightBarButtonItem = rightBarButtonItem
Swift 4.2;
添加viewController
override func viewDidLoad() {
super.viewDidLoad()
self.addNavigationBarButton(imageName: "ic_back", direction:.left)
}
添加 Class
您的 API 或实用程序 Class
public func addNavigationBarButton(imageName:String,direction:direction){
var image = UIImage(named: imageName)
image = image?.withRenderingMode(.alwaysOriginal)
switch direction {
case .left:
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
case .right:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
}
}
@objc public func goBack() {
self.navigationController?.popViewController(animated: true)
}
public enum direction {
case right
case left
}
在 Xcode 10.2、swift 5.0 中测试;
首先,我已经在 IB 的 UINavigationController 中嵌入了我的 ViewController。
然后在 ViewDidLoad 中包含这些行
self.title = "orange"
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(changeLayout)).
注意 - 访问标题或通过导航控制器添加按钮不起作用。例如:设置标题 - Self.navigationcontroller.navigationItem.title 无效,
我在视图控制器的顶部添加了一个导航栏。我试图根据条件控制按钮是否可见,但添加按钮时遇到问题。到目前为止,
var addButton: UIBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
override func viewDidLoad() {
super.viewDidLoad()
let boool = true
if boool {
self.navigationItem.rightBarButtonItem = self.addButton
}
else {
self.navigationItem.rightBarButtonItem = nil
}
}
func addTapped(sender: AnyObject) {
print("hjxdbsdhjbv")
}
我认为它无法正常工作,因为我在 VC 中添加了一个导航栏,而不是使用导航控制器并在那里使用该栏。我想知道是否有办法使用这个导航栏。
您说您通过情节提要向您的视图控制器添加了一个 UINavigationBar
,但是查看您提供的代码,在 IB 中没有与您的导航栏的出口连接。
为了访问 self.navigationItem
,您的视图控制器必须嵌入 UINavigationController
或成为层次结构的一部分。除非您需要在单个视图控制器上使用自定义导航栏,否则我建议将其从 Interface Builder 中删除,然后确保有问题的视图控制器嵌入到 UINavigationController
中或将其推送到导航中从另一个嵌入导航控制器的控制器堆栈,然后你应该看到你的 UIBarButtonItem
.
首先,您需要将导航栏连接到 IBOutlet,以便您可以在代码中引用它。之后,此代码应该可以工作:
let navigationItem = UINavigationItem(title: "Title")
navigationItem.rightBarButtonItem = self.addButton
navigationItem.hidesBackButton = true
self.navigationBar.pushItem(navigationItem, animated: false)
很简单。把这行代码放到 viewDidLoad
:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
已更新 Swift 4 或更高版本:
自定义函数:
@objc func action(sender: UIBarButtonItem) {
// Function body goes here
}
(自定义)右栏按钮项:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
(自定义)左栏按钮项:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
您也可以像这样添加系统栏按钮项目:UIBarButtonItem.SystemItem
为栏按钮项目定义系统提供的图像:.add, .done, .取消、.edit、.save、.compose、.reply、.organize 等等。
(系统)右栏按钮项:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
(系统)左栏按钮项:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
let rightBarButtonItem = UIBarButtonItem.init(image: UIImage(named: "EditImage"), style: .done, target: self, action: #selector(ViewController.call_Method))
self.navigationItem.rightBarButtonItem = rightBarButtonItem
Swift 4.2;
添加viewController
override func viewDidLoad() {
super.viewDidLoad()
self.addNavigationBarButton(imageName: "ic_back", direction:.left)
}
添加 Class
您的 API 或实用程序 Class
public func addNavigationBarButton(imageName:String,direction:direction){
var image = UIImage(named: imageName)
image = image?.withRenderingMode(.alwaysOriginal)
switch direction {
case .left:
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
case .right:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
}
}
@objc public func goBack() {
self.navigationController?.popViewController(animated: true)
}
public enum direction {
case right
case left
}
在 Xcode 10.2、swift 5.0 中测试; 首先,我已经在 IB 的 UINavigationController 中嵌入了我的 ViewController。 然后在 ViewDidLoad 中包含这些行
self.title = "orange"
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(changeLayout)).
注意 - 访问标题或通过导航控制器添加按钮不起作用。例如:设置标题 - Self.navigationcontroller.navigationItem.title 无效,