changing nav bar item programmatically in Swift
The following code should work:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let refreshButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Refresh, target: self, action: "buttonMethod")
navigationItem.leftBarButtonItem = refreshButton
navigationController?.navigationBar.barTintColor = UIColor.greenColor()
title = "Search result"
}
func buttonMethod() {
print("Perform action")
}
}
If you really need to perform it in viewWillAppear:
, here is the code:
import UIKit
class ViewController: UIViewController {
var isLoaded = false
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if !isLoaded {
let refreshButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Refresh, target: self, action: "buttonMethod")
navigationItem.leftBarButtonItem = refreshButton
isLoaded = true
navigationController?.navigationBar.barTintColor = UIColor.greenColor()
title = "Search result"
}
}
func buttonMethod() {
print("Perform action")
}
}
You can learn more about the navigationItem
properties with this previous question.
Changing navigation title programmatically
You change the title by changing the title of the view controller being displayed:
viewController.title = "some title"
Normally this is done in view did load on the view controller:
override func viewDidLoad() {
super.viewDidLoad()
self.title = "some title"
}
However, this only works if you have your view controller embedded in a UINavigationController. I highly recommend doing this instead of creating a navigation bar yourself. If you insist on creating a navigation bar yourself, you can change the title by doing:
navigationBar.topItem.title = "some title"
How do i change properties of a navigation bar item programmatically?
Use below code to set title attributes in viewDidLoad()
.
navigationController?.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.white,
.font: UIFont.systemFont(ofSize: 16)]
Create NavBar programmatically with Button and Title Swift
Updated for Swift 5
Create a navigation item instance and set title and right/left buttons to it. After navigation item is configured add it to the navigation bar.
let navBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 44))
view.addSubview(navBar)
let navItem = UINavigationItem(title: "SomeTitle")
let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(selectorName:))
navItem.rightBarButtonItem = doneItem
navBar.setItems([navItem], animated: false)
Changing Nav Bar title programmatically
self.navigationController.navigationBar.topItem.title = @"YourTitle";
Change bar button item programmatically after user presses it Swift
Add an action for UIBarButtonItem
on your UIViewController
class by control dragging it into the ViewController's declaration. Then change the item
@IBAction func barButtonAction(_ sender: UIBarButtonItem) {
sender.image = UIImage(named: "myNewImage")
}
UIBarButtonItem in navigation bar programmatically?
Custom button image without setting button frame:
You can use init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)
to initializes a new item using the specified image and other properties.
let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
self.navigationItem.rightBarButtonItem = button1
Check this Apple Doc. reference
UIBarButtonItem with custom button image using button frame
FOR Swift 3.0
let btn1 = UIButton(type: .custom)
btn1.setImage(UIImage(named: "imagename"), for: .normal)
btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside)
let item1 = UIBarButtonItem(customView: btn1)
let btn2 = UIButton(type: .custom)
btn2.setImage(UIImage(named: "imagename"), for: .normal)
btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside)
let item2 = UIBarButtonItem(customView: btn2)
self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)
FOR Swift 2.0
and older
let btnName = UIButton()
btnName.setImage(UIImage(named: "imagename"), forState: .Normal)
btnName.frame = CGRectMake(0, 0, 30, 30)
btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside)
//.... Set Right/Left Bar Button item
let rightBarButton = UIBarButtonItem()
rightBarButton.customView = btnName
self.navigationItem.rightBarButtonItem = rightBarButton
Or simply use init(customView:) like
let rightBarButton = UIBarButtonItem(customView: btnName)
self.navigationItem.rightBarButtonItem = rightBarButton
For System UIBarButtonItem
let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
self.navigationItem.rightBarButtonItem = camera
For set more then 1 items use rightBarButtonItems
or for left side leftBarButtonItems
let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
let item1 = UIBarButtonItem()
item1.customView = btn1
let btn2 = UIButton()
btn2.setImage(UIImage(named: "img2"), forState: .Normal)
btn2.frame = CGRectMake(0, 0, 30, 30)
btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside)
let item2 = UIBarButtonItem()
item2.customView = btn2
self.navigationItem.rightBarButtonItems = [item1,item2]
Using setLeftBarButtonItem
or setRightBarButtonItem
let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);
For swift >= 2.2 action should be
#selector(Class.MethodName)
... for e.g.btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)
How can I add a navigation bar programmatically that actually fits the screen?
you just need to set translatesAutoresizingMaskIntoConstraints to false and all will be ok. You need this because you add constraints to your view on your own. If you don't do that than you must handle navbar width on your own when phone changes orientation ( viewWillTransition()... ).
Also if this is set to true and you add your own constraints you will probably get some conflicts.
So, do this:
let myNav = UINavigationBar(frame: CGRect.zero)
myNav.translatesAutoresizingMaskIntoConstraints = false
also you don't need to set width of navbar because you use constraints. You just set it CGRect.zero
You can read more about translatesAutoresizingMaskIntoConstraints here
Related Topics
Xcode 8 Shell Script Invocation Error
Instagram Explorer Searchbar and Tableview
Memory Problems When Switching Between Scenes Spritekit
How to Create an Uppercase Version of a String in Swiftui
Having Trouble with Nstimer (Swift)
Passing and Storing Closures/Callbacks in Swift
Swift; Delegate Embedded View Controller and Parent
How to Convert Data of Int16 Audio Samples to Array of Float Audio Samples
Swift: Animate Object Along Animating Path
Type '()' Cannot Conform to 'View'
Scenekit Won't Scale a Dynamic Body
Swift String Permutations Allowing the Same Strings
Iterating Over an Nsorderedset
Swift Extension Storage for Protocols
How to Have Arview and Arscnview Coexist