UIBarButtonItem नेविगेशन बार में प्रोग्रामेटिक रूप से?


135

मैं थोड़ी देर के लिए इस समाधान के लिए चारों ओर देख रहा हूँ, लेकिन कोई भी नहीं मिला है। जैसे एक उपाय है

 self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)

यह कोड "स्टॉप" छवि के साथ एक बटन जोड़ देगा। बस इसी तरह, "खोज," ताज़ा "आदि के साथ अन्य समाधान भी हैं लेकिन क्या होगा अगर मैं उस छवि के साथ प्रोग्राम बटन जोड़ना चाहता हूं जो आप चाहते हैं?

जवाबों:


342

कस्टम बटन छवि के बिना सेटिंग बटन फ्रेम:

आप 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 डॉक्टर की जाँच करें । संदर्भ


बटन फ्रेम का उपयोग करके कस्टम बटन छवि के साथ 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)

के लिए 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

या बस का उपयोग customView init (:) की तरह

 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)


बहुत बढ़िया जवाब। केवल यह let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
बताना

मैंने पाया कि यदि आप चाहते हैं कि आपके बटन में वह पाठ भी शामिल हो जो आपको CGRect भाग को निर्दिष्ट करना चाहिए। एसओ के आसपास कुछ उदाहरण तैर रहे हैं जो इसे निर्दिष्ट नहीं करते हैं।
मीका मोंटोया

आपके सही उत्तर के लिए धन्यवाद। स्विफ्ट 4 के लिए अपडेट जोड़ना बुरा नहीं है।
मिलाद फरीदिया

38

यह बहुत आसान है 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

}

तब आपको उस फ़ंक्शन को परिभाषित करने की आवश्यकता है जिसे आपने नीचे दिए गए कार्रवाई पैरामीटर के रूप में उल्लेख किया है

@objc func logoutUser(){
     print("clicked")
}

आपको @objcउपसर्ग जोड़ने की आवश्यकता है क्योंकि यह अभी भी विरासत सामान (उद्देश्य सी) का उपयोग कर रहा है।


17

बस UIBarButtonItemcustomView के साथ सेटअप

उदाहरण के लिए:

  var leftNavBarButton = UIBarButtonItem(customView:yourButton)
  self.navigationItem.leftBarButtonItem = leftNavBarButton

या उपयोग setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);

1
मैं आपके उत्तर को वोट कर रहा हूं क्योंकि आपका कोड भी काम करता है, लेकिन भाविन का कोड एक शॉट समाधान है इसलिए मैं उनके उत्तर को स्वीकार करूंगा। आपके योगदान के लिए धन्यवाद :)
राहुल सोनवने

11

मैं बस इस सवाल पर अड़ गया और यहां स्विफ्ट 3 और आईओएस 10 के लिए एक अपडेट है:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
self.navigationItem.rightBarButtonItem  = testUIBarButtonItem

यह निश्चित रूप से सभी संपत्तियों के साथ UIButton बनाने की तुलना में बहुत तेज़ है और फिर बाद में कस्टम व्यू को UIBarButtonItem में जोड़ देता है।

और अगर आप छवि के रंग को डिफ़ॉल्ट नीले रंग से उदा सफेद में बदलना चाहते हैं, तो आप हमेशा रंग बदल सकते हैं:

test.tintColor = UIColor.white()

पुनश्च आपको अपने ऐप के लिए स्पष्ट रूप से चयनकर्ता आदि को बदलना चाहिए :)


7

स्विफ्ट 3.0+ में, UIBarButtonItemप्रोग्रामेटिक रूप से निम्नानुसार सेट किया गया है:

   override func viewDidLoad() {
        super.viewDidLoad()
        let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(self.clickButton))
        self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    }

   @objc func clickButton(){
            print("button click")
     }

3

मूल छवि के साथ LeftBarButton की स्थापना।

let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
self.navigationItem.leftBarButtonItem  = menuButton

2

मेरे पास एक ही मुद्दा है और मैंने किसी अन्य विषय में उत्तर पढ़े हैं फिर मैं इसी तरह का एक और समाधान करता हूं। मुझे नहीं पता कि कौन अधिक प्रभावी है। इसी तरह का मुद्दा

//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 );
}

1

यह सेब की एक पागल चीज है। जब आप कहते हैं self.navigationItem.rightBarButtonItem.title तब यह GUI पर NIL कहेगा, यह एडिट या सेव दिखाता है। फ्रेशर पसंद करता है मुझे इस व्यवहार को डीबग करने में बहुत समय लगेगा।

एक आवश्यकता है कि आइटम फ़र्ट लोड में संपादित दिखाएगा तब उपयोगकर्ता उस पर टैप करता है यह सेव टाइटल में बदल जाएगा। इसे संग्रहीत करने के लिए, मैंने नीचे दिया है।

// देखे गए लोड को एडिट शीर्षक कहेंगे

private func loadRightBarItem() {
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
}

// टैप एड आइटम सेव टाइटल में बदल जाएगा

@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)
}

// टैप सेव आइटम संपादित शीर्षक प्रदर्शित करेगा

@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)

}

1

iOS 11

बाधा का उपयोग करके एक कस्टम बटन सेट करना:

let buttonWidth = CGFloat(30)
let buttonHeight = CGFloat(30)

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "img name"), for: .normal)
button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
button.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: button)

0
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)
}

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.