프로그래밍 방식으로 탐색 모음의 UIBarButtonItem?
나는이 솔루션을 잠시 동안 찾고 있었지만 아무것도 얻지 못했습니다. 예를 들어 하나의 솔루션은
self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)
이 코드는 "중지"이미지가있는 버튼을 추가합니다. 이와 같이 "검색,"새로 고침 "등의 다른 솔루션이 있습니다. 그러나 원하는 이미지로 프로그래밍 방식으로 단추를 추가하려면 어떻게해야합니까?
버튼 프레임을 설정하지 않은 사용자 정의 버튼 이미지 :
init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)
지정된 이미지 및 기타 속성을 사용하여 새 항목을 초기화하는 데 사용할 수 있습니다 .
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
이 Apple Doc을 확인하십시오 . 참고
버튼 프레임을 사용하여 사용자 정의 버튼 이미지가있는 UIBarButtonItem
에 대한 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
이상
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
또는 단순히 다음 과 같이 init (customView :) 를 사용하십시오.
let rightBarButton = UIBarButtonItem(customView: btnName) self.navigationItem.rightBarButtonItem = rightBarButton
시스템 UIBarButtonItem의 경우
let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
self.navigationItem.rightBarButtonItem = camera
1 개 이상의 항목을 설정하려면 rightBarButtonItems
왼쪽을 사용하십시오.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]
setLeftBarButtonItem
또는 사용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);
신속한> = 2.2의 경우 동작은
#selector(Class.MethodName)
...btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)
Swift 4
또는로 훨씬 쉽습니다Swift 4.2
당신의 내부 ViewDidLoad
방법, 당신의 버튼을 정의하고 탐색 모음에 추가합니다.
override func viewDidLoad() {
super.viewDidLoad()
let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
self.navigationItem.rightBarButtonItem = logoutBarButtonItem
}
다음과 같이 action 매개 변수 내부에서 언급 한 기능을 정의해야합니다
@objc func logoutUser(){
print("clicked")
}
@objc
여전히 기존 항목을 사용하므로 접두사 를 추가해야합니다 (목표 C).
UIBarButtonItem
customView로 설정 하기 만하면됩니다
예를 들면 다음과 같습니다.
var leftNavBarButton = UIBarButtonItem(customView:yourButton)
self.navigationItem.leftBarButtonItem = leftNavBarButton
또는 사용 setFunction
:
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);
방금이 질문을 우연히 발견했으며 다음은 Swift 3 및 iOS 10에 대한 업데이트입니다.
let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
self.navigationItem.rightBarButtonItem = testUIBarButtonItem
모든 속성으로 UIButton을 만든 다음 UIBarButtonItem에 customView를 추가하는 것보다 훨씬 빠릅니다.
And if you want to change the color of the image from the default blue to e.g. white, you can always change the tint color:
test.tintColor = UIColor.white()
PS You should obviously change the selector etc. for your app :)
In swift 3 for action in the bar button:
let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(ViewController.clickButton))
self.navigationItem.rightBarButtonItem = testUIBarButtonItem
func clickButton(){
print("button click")
}
I have same issue and I have read answers in another topic then I solve another similar way. I do not know which is more effective. similar issue
//play button
@IBAction func startIt(sender: AnyObject) {
startThrough();
};
//play button
func startThrough() {
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true);
let pauseButton = UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "pauseIt");
self.toolBarIt.items?.removeLast();
self.toolBarIt.items?.append( pauseButton );
}
func pauseIt() {
timer.invalidate();
let play = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "startThrough");
self.toolBarIt.items?.removeLast();
self.toolBarIt.items?.append( play );
}
Setting LeftBarButton with Original Image.
let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
self.navigationItem.leftBarButtonItem = menuButton
func viewDidLoad(){
let homeBtn: UIButton = UIButton(type: UIButtonType.custom)
homeBtn.setImage(UIImage(named: "Home.png"), for: [])
homeBtn.addTarget(self, action: #selector(homeAction), for: UIControlEvents.touchUpInside)
homeBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
let homeButton = UIBarButtonItem(customView: homeBtn)
let backBtn: UIButton = UIButton(type: UIButtonType.custom)
backBtn.setImage(UIImage(named: "back.png"), for: [])
backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside)
backBtn.frame = CGRect(x: -10, y: 0, width: 30, height: 30)
let backButton = UIBarButtonItem(customView: backBtn)
self.navigationItem.setLeftBarButtonItems([backButton,homeButton], animated: true)
}
}
This is a crazy thing of apple. When you say self.navigationItem.rightBarButtonItem.title then it will say nil while on the GUI it shows Edit or Save. Fresher likes me will take a lot of time to debug this behavior.
There is a requirement that the Item will show Edit in the firt load then user taps on it It will change to Save title. To archive this, i did as below.
//view did load will say Edit title
private func loadRightBarItem() {
let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
self.navigationItem.rightBarButtonItem = logoutBarButtonItem
}
// tap Edit item will change to Save title
@objc private func handleEditBtn() {
print("clicked on Edit btn")
let logoutBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(handleSaveBtn))
self.navigationItem.rightBarButtonItem = logoutBarButtonItem
blockEditTable(isBlock: false)
}
//tap Save item will display Edit title
@objc private func handleSaveBtn(){
print("clicked on Save btn")
let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
self.navigationItem.rightBarButtonItem = logoutBarButtonItem
saveInvitation()
blockEditTable(isBlock: true)
}
참고URL : https://stackoverflow.com/questions/30022780/uibarbuttonitem-in-navigation-bar-programmatically
'IT박스' 카테고리의 다른 글
WPF 바인딩에서 값을 null로 설정 (0) | 2020.07.23 |
---|---|
C #에서 foreach 루프를 벗어나려면 어떻게해야합니까? (0) | 2020.07.22 |
TextView.setTextSize가 비정상적으로 작동 함-다른 화면에 대해 textview의 텍스트 크기를 동적으로 설정하는 방법 (0) | 2020.07.22 |
다음 클래스를 찾을 수 없습니다 : android.support.v7.internal.app.WindowDecorActionBar (0) | 2020.07.22 |
EJB 3.1과 CDI는 어디에 사용합니까? (0) | 2020.07.22 |