स्विफ्ट में UIBarButtonItem के लिए कार्रवाई कैसे सेट करें


86

स्विफ्ट में कस्टम UIBarButtonItem के लिए कार्रवाई कैसे सेट की जा सकती है?

निम्नलिखित कोड नेविगेशन बार में बटन को सफलतापूर्वक रखता है:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:nil)
self.navigationItem.rightBarButtonItem = b

अब, मैं func sayHello() { println("Hello") }बटन को छूने पर कॉल करना चाहूंगा । अब तक के मेरे प्रयास:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:sayHello:)
// also with `sayHello` `sayHello()`, and `sayHello():`

तथा..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(sayHello:))
// also with `sayHello` `sayHello()`, and `sayHello():`

तथा..

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:@selector(self.sayHello:))
// also with `self.sayHello` `self.sayHello()`, and `self.sayHello():`

ध्यान दें कि sayHello()इंटेलीजेंस में दिखाई देता है, लेकिन काम नहीं करता है।

आपकी सहायता के लिए धन्यवाद।

संपादित करें: पोस्टीरिटी के लिए, निम्नलिखित कार्य:

var b = UIBarButtonItem(title: "Continue", style: .Plain, target: self, action:"sayHello")

4
आप चयनकर्ता को एक तार में सिर्फ चयनकर्ता डालकर तेजी से पास करते हैं,action: "sayHello"
जियारो जूल

बहुत बहुत धन्यवाद। मैं इसे बाहर निकालने के लिए दबाव में हूं और निराश हो रहा हूं।
किमीकिले 20

1
यह प्रश्न पहले स्विफ्ट में @selector () के डुप्लिकेट के रूप में चिह्नित किया गया था ? । हालाँकि, यह सवाल विशेष रूप से पूछता है UIBarButtonItemजबकि दूसरा नहीं करता है। सभी उपयोगों को सामान्य बनाने के लिए शुरुआती की आवश्यकता selectorउनके लिए मुश्किल हो सकती है, इसलिए मैं डुप्लिकेट स्थिति को हटा रहा हूं ताकि लोग इस प्रश्न को अद्यतित रख सकें।
सुरगाछ

जवाबों:


157

स्विफ्ट 2.2 के रूप में, कंपाइलर-टाइम चेक किए गए चयनकर्ताओं के लिए एक विशेष सिंटैक्स है। यह वाक्य रचना का उपयोग करता है #selector(methodName):।

स्विफ्ट 3 और बाद में:

var b = UIBarButtonItem(
    title: "Continue",
    style: .plain,
    target: self,
    action: #selector(sayHello(sender:))
)

func sayHello(sender: UIBarButtonItem) {
}

यदि आप अनिश्चित हैं कि विधि का नाम कैसा दिखना चाहिए, तो कॉपी कमांड का एक विशेष संस्करण है जो बहुत उपयोगी है। आधार विधि नाम (जैसे sayHello) और प्रेस में अपने कर्सर कहीं रखो Shift+ Control+ Option+ C। जो आपके कीबोर्ड पर 'सिंबल नेम' चिपका देता है। यदि आप Commandइसे पकड़ भी लेते हैं तो यह 'क्वालिफाइड सिंबल नेम' को कॉपी करेगा जिसमें टाइप भी शामिल होगा।

स्विफ्ट 2.3:

var b = UIBarButtonItem(
    title: "Continue",
    style: .Plain,
    target: self,
    action: #selector(sayHello(_:))
)

func sayHello(sender: UIBarButtonItem) {
}

ऐसा इसलिए है क्योंकि विधि कॉल करते समय स्विफ्ट 2.3 में पहले पैरामीटर नाम की आवश्यकता नहीं है।

आप यहां स्विफ्ट.ऑर्ग पर सिंटैक्स के बारे में अधिक जान सकते हैं: https://swift.org/blog/swift-2-2-new-features/#compile-time-checked-selectors


11
बस यह उल्लेख करने के लिए कि क्रिया फ़ंक्शन निजी नहीं हो सकता है ! मुझे वास्तव में यकीन नहीं है कि क्यों, लेकिन मुझे हमेशा एक त्रुटि मिलती है जब मैंने कुछ निजी फ़ंक्शन का नाम प्रदान किया
मैडोब जूल

"MethodSignatureForSelector लागू नहीं है": मैं यह मिल गया
AlamoPS

1
@AlamoPS यदि आप बृहदान्त्र के साथ 2 संस्करण का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि फ़ंक्शन पैरामीटर प्रकार मेल करें कि आप जो भी कार्य संभाल रहे हैं उसके लिए।
जेसन

1
@RyanForsyth स्ट्रिंग वास्तव में Selector("sayHello")स्विफ्ट द्वारा पर्दे के पीछे अनुवाद किया जाता है।
फतहोकू

2
यह उत्तर पुराना है।
डेन लोवेनहर्ज़

33

स्विफ्ट 4/5 उदाहरण

button.target = self
button.action = #selector(buttonClicked(sender:))

@objc func buttonClicked(sender: UIBarButtonItem) {
        
}

5
यह सही है, स्विफ्ट 4 के लिए आपको @objcफ़ंक्शन घोषणा में जोड़ना होगा। स्विफ्ट 4 तक यह अनुमान लगाया गया था।
जोनाथन कबरेरा

1
button.target = self
महेश

@ महेश को लक्ष्य निर्धारित करने की आवश्यकता नहीं है
norbDEV

स्विफ्ट 5 के लिए @norbDEV लक्ष्य की आवश्यकता है
Biasi Wiga

2

स्विफ्ट 5 और आईओएस 13+ प्रोग्रामेटिक उदाहरण

  1. आपको अपना फ़ंक्शन चिह्नित करना होगा @objc, नीचे उदाहरण देखें!
  2. फ़ंक्शन नाम के बाद कोई कोष्ठक नहीं! बस उपयोग करें #selector(name)
  3. privateया publicकोई फर्क नहीं पड़ता; आप निजी का उपयोग कर सकते हैं।

कोड उदाहरण

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    let menuButtonImage = UIImage(systemName: "flame")
    let menuButton = UIBarButtonItem(image: menuButtonImage, style: .plain, target: self, action: #selector(didTapMenuButton))
    navigationItem.rightBarButtonItem = menuButton
}

@objc public func didTapMenuButton() {
    print("Hello World")
}

0

यह एक और थोड़ा मदद कर सकता है

मान लें कि यदि आप बार बटन को एक अलग फ़ाइल (मॉड्यूलर दृष्टिकोण के लिए) में बनाना चाहते हैं और चयनकर्ता को अपने व्यू-कंट्रोलर को वापस देना चाहते हैं, तो आप इस तरह कर सकते हैं: -

आपकी उपयोगिता फ़ाइल

class GeneralUtility {

    class func customeNavigationBar(viewController: UIViewController,title:String){
        let add = UIBarButtonItem(title: "Play", style: .plain, target: viewController, action: #selector(SuperViewController.buttonClicked(sender:)));  
      viewController.navigationController?.navigationBar.topItem?.rightBarButtonItems = [add];
    }
}

फिर एक SuperviewController क्लास बनाएं और उस पर उसी फ़ंक्शन को परिभाषित करें।

class SuperViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
            // Do any additional setup after loading the view.
    }
    @objc func buttonClicked(sender: UIBarButtonItem) {

    }
}

और हमारे बेस व्यूकंट्रोलर में (जो आपके सुपरविओकंट्रोलर वर्ग को विरासत में मिला है) उसी फ़ंक्शन को ओवरराइड करता है

import UIKit

class HomeViewController: SuperViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func viewWillAppear(_ animated: Bool) {
        GeneralUtility.customeNavigationBar(viewController: self,title:"Event");
    }

    @objc override func buttonClicked(sender: UIBarButtonItem) {
      print("button clicked")    
    } 
}

अब आप जिस भी वर्ग में इस बारबटन को चाहते हैं, उसमें SuperViewController वारिस करें।

पढ़ने के लिए धन्यवाद


0

स्विफ्ट 5

यदि आपने UIBarButtonItemइंटरफ़ेस बिल्डर में बनाया है और आप आउटलेट से आइटम से जुड़े हैं और चयनकर्ता को प्रोग्रामेटिक रूप से बांधना चाहते हैं।

लक्ष्य और चयनकर्ता को सेट करना न भूलें।

addAppointmentButton.action = #selector(moveToAddAppointment)
addAppointmentButton.target = self

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