2016-06-26 14 views
47

यह तेजी से 3 में क्यों काम नहीं करता है?स्विफ्ट 3 में चयनकर्ता

: यह कह रनटाइम पर दुर्घटनाओं '- [my_app_name.displayOtherAppsCtrl नल:]: गैर मान्यता प्राप्त चयनकर्ता उदाहरण 0x17eceb70 के लिए भेजा'

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Register cell classes 
    //self.collectionView!.register(ImageCell.self, forCellWithReuseIdentifier: reuseIdentifier) 

    // Do any additional setup after loading the view. 

    let lpgr = UITapGestureRecognizer(target: self, action: Selector("tap:")) 
    lpgr.delegate = self 
    collectionView?.addGestureRecognizer(lpgr) 
} 

func tap(gestureReconizer: UITapGestureRecognizer) { 
if gestureReconizer.state != UIGestureRecognizerState.ended { 
    return 
} 

let p = gestureReconizer.location(in: self.collectionView) 
let indexPath = self.collectionView?.indexPathForItem(at: p) 

if let index = indexPath { 
    //var cell = self.collectionView?.cellForItem(at: index) 
    // do stuff with your cell, for example print the indexPath 
    print(index.row) 
} else { 
    print("Could not find index path") 
} 
} 
+4

आपने 'चयनकर्ता (" टैप: ") लिखा है '। आपको चेतावनी मिली आपने इसे अनदेखा किया। तुम दुर्घटनाग्रस्त हो गए – matt

उत्तर

119

Selector("tap:") अब #selector(tap(gestureReconizer:))

के रूप में लिखा जाना चाहिए साथ ही, आपको नए Swift API Guidelines के अनुसार func tap(_ gestureRecognizer: UITapGestureRecognizer) के रूप में टैप घोषित करना चाहिए, इस मामले में आपका चयनकर्ता #selector(tap(_:)) बन जाएगा।

+4

आपको इसे इस तरह लिखना होगा: '# चयनकर्ता (कक्षा नाम। विधिनाम)' अन्यथा आप objc चयनकर्ता के बारे में एक त्रुटि प्राप्त कर सकते हैं। – RoaflinSabos

+0

@RoaflinSabos आपको केवल कक्षा का नाम शामिल करने की आवश्यकता है यदि विधि उस वर्ग के बाहर है जिसे चयनकर्ता घोषित किया गया है। यह उद्देश्य-सी दृश्यता को भी प्रभावित नहीं करता है। – jjatie

19

स्विफ्ट 3 में यह इस तरह काम करता है:

@IBOutlet var myView: UIView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap)) 

    myView.addGestureRecognizer(tap) 
} 

func handleTap() { 
    print("tapped") 
} 
+2

यह बहुत अच्छा है क्योंकि यह दिखाता है कि आपको एक विधि के अंदर UITapGestureRecognizer को init करना है ... मुझे प्रमुख समस्याएं थीं क्योंकि मैं फ़ाइल के शीर्ष पर टैप को घोषित करने और इनिट करने के दौरान (बेवकूफ) था। खराब डिबगिंग संदेश सामने आए, और हल करने में काफी समय लगा: एस ... ध्यान दिया जाना चाहिए, यदि आप फ़ंक्शन को निजी बनाते हैं, तो आपको लगता है कि "निजी func ..." –

0

स्विफ्ट 3:

class MYPTempController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
     view.addSubview(btn) 
     btn.addTarget(self, action: #selector(MYPTempController.btnClick), for: .touchUpInside) 
    } 
    @objc fileprivate func btnClick() { 
     print("--click--") 
    } 
} 

//带参数 
btn.addTarget(self, action: #selector(MYPTempController.btnClick(_:)), for: .touchUpInside) 
//监听方法 
func btnClick(_ sender: UIButton) { 
    print("--click--") 
} 
2

स्विफ्ट 3 चयनकर्ता का उपयोग कर ("नल की तो बजाय नई वाक्य रचना के साथ आया था: "), # चयनकर्ता (टैप (इशारा रिसीनाइज़र :))

+1

से पहले @objc को जोड़ना होगा ...? ऐसा लगता है कि वाक्य लापता का एक हिस्सा है। – msanford

संबंधित मुद्दे