সুইফটে @ সিলেক্টর ()?


659

আমি একজন তৈরি করার চেষ্টা করছি NSTimerSwiftকিন্তু আমি কিছু সমস্যা হচ্ছে।

NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)

test() একই ক্লাসে একটি ফাংশন।


আমি সম্পাদকটিতে একটি ত্রুটি পেয়েছি:

সরবরাহ করা আর্গুমেন্ট গ্রহণ করে এমন 'আরআইডি' এর জন্য কোনও ওভারলোড খুঁজে পাওয়া যায়নি

যখন আমি পরিবর্তন selector: test()করতে selector: nilত্রুটি দেখা যাবে না।

আমি চেষ্টা করেছিলাম:

  • selector: test()
  • selector: test
  • selector: Selector(test())

তবে কিছুই কার্যকর হয় না এবং আমি উল্লেখগুলিতে কোনও সমাধান পাই না।


11
selector: test()কল testএবং selectorআর্গুমেন্ট তার ফিরে মান পাস হবে ।
মাইকেল ডারস্ট

উত্তর:


930

সুইফট নিজেই নির্বাচকদের ব্যবহার করে না - বেশ কয়েকটি ডিজাইনের নিদর্শন যা সিলেক্টর সিলেক্টরগুলি সুইফটে আলাদাভাবে কাজ করে। (উদাহরণস্বরূপ, প্রোটোকল প্রকারের পরিবর্তে বা is/ asপরীক্ষায় onচ্ছিক শৃঙ্খলা ব্যবহার করুন respondsToSelector:এবং performSelector:আরও ভাল টাইপ / মেমরির সুরক্ষার পরিবর্তে আপনি যেখানেই পারেন ক্লোজারগুলি ব্যবহার করুন ))

তবে এখনও অনেকগুলি গুরুত্বপূর্ণ ওবিসিসি ভিত্তিক এপিআই রয়েছে যা টাইমার এবং লক্ষ্য / ক্রিয়া প্যাটার্ন সহ নির্বাচক ব্যবহার করে। Selectorএইগুলির সাথে কাজ করার জন্য সুইফট প্রকারটি সরবরাহ করে । (ওবিজেসির SELধরণের স্থানে সুইফট স্বয়ংক্রিয়ভাবে এটি ব্যবহার করে ))

সুইফট ২.২ (এক্সকোড .3.৩) এবং তারপরে (সুইফট 3 / এক্সকোড 8 এবং সুইফট 4 / এক্সকোড 9 সহ):

আপনি এক্সপ্রেশনটি Selectorব্যবহার করে একটি সুইফট ফাংশন টাইপ থেকে একটি নির্মাণ করতে পারেন #selector

let timer = Timer(timeInterval: 1, target: object,
                  selector: #selector(MyClass.test),
                  userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
                 for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
             with: button, with: otherButton)

এই পদ্ধতির সম্পর্কে দুর্দান্ত জিনিস? একটি ফাংশন রেফারেন্সটি সুইফ্ট সংকলক দ্বারা পরীক্ষা করা হয়, সুতরাং আপনি #selectorকেবলমাত্র শ্রেণি / পদ্ধতিযুক্ত জোড়গুলির সাথে অভিব্যক্তিটি ব্যবহার করতে পারেন যা বাস্তবে বিদ্যমান এবং নির্বাচক হিসাবে ব্যবহারের জন্য যোগ্য (নীচে "নির্বাচক প্রাপ্যতা" দেখুন)। ফাংশন-ধরণের নামকরণের সুইফট ২.২+ নিয়ম অনুসারে আপনার ফাংশনটিকে কেবল আপনার প্রয়োজন অনুসারে রেফারেন্স হিসাবে নির্দ্বিধায় মুক্ত করতে পারেন ।

(এটি আসলে ওবিজির @selector()নির্দেশনার চেয়ে উন্নতি , কারণ সংকলকটির চেকটি -Wundeclared-selectorকেবলমাত্র নির্বাচিত নির্বাচিত উপস্থিত রয়েছে তা #selectorযাচাই করে existence আপনি অস্তিত্ব, ক্লাসে সদস্যপদ এবং স্বাক্ষর টাইপ করে যাচাই করেন সুইফট ফাংশন রেফারেন্স ))

আপনি যে #selectorঅভিব্যক্তিটিতে পাঠাচ্ছেন সেই ফাংশন রেফারেন্সের জন্য আরও কয়েকটি অতিরিক্ত সতর্কতা রয়েছে :

  • একই বেস নামের একাধিক ফাংশন ফাংশন রেফারেন্সের জন্য পূর্বোক্ত সিনট্যাক্স ব্যবহার করে তাদের পরামিতি লেবেলের দ্বারা পৃথক করা যায় (যেমন insertSubview(_:at:)বনাম insertSubview(_:aboveSubview:))। তবে যদি কোনও ফাংশনটির কোনও প্যারামিটার না থাকে তবে তা ছিন্ন করার একমাত্র উপায় হ'ল asফাংশনের ধরণের স্বাক্ষর (যেমন foo as () -> ()বনাম foo(_:)) সহ একটি কাস্ট ব্যবহার করা ।
  • সুইফট +.০+ তে প্রপার্টি গেটার / সেটার জোড়ার জন্য একটি বিশেষ সিনট্যাক্স রয়েছে। উদাহরণস্বরূপ, একটি দেওয়া var foo: Int, আপনি ব্যবহার করতে পারেন #selector(getter: MyClass.foo)বা #selector(setter: MyClass.foo)

সাধারণ নোট:

মামলাগুলি যেখানে #selectorকাজ করে না, এবং নামকরণ করে না: কখনও কখনও আপনার সাথে কোনও নির্বাচক তৈরি করার জন্য কোনও ফাংশন রেফারেন্স থাকে না (উদাহরণস্বরূপ, ওজজিসি রানটাইমটিতে গতিশীলভাবে নিবন্ধিত পদ্ধতি সহ)। সেক্ষেত্রে আপনি Selectorএকটি স্ট্রিং থেকে একটি নির্মাণ করতে পারেন : উদাহরণস্বরূপ Selector("dynamicMethod:")- যদিও আপনি সংকলকের বৈধতা যাচাই হারিয়েছেন। আপনি যখন এটি করেন, আপনাকে :প্রতিটি প্যারামিটারের জন্য কলোন ( ) সহ ওবিজেসি নামকরণের নিয়ম অনুসরণ করতে হবে ।

নির্বাচকের প্রাপ্যতা: নির্বাচক দ্বারা বর্ণিত পদ্ধতিটি অবশ্যই ObjC রানটাইমের সংস্পর্শে আসতে হবে। সুইফট 4-এ, ওবিজেসি-এর কাছে প্রকাশিত প্রতিটি পদ্ধতির অবশ্যই তার ঘোষণাটি অবশ্যই গুনের সাথে থাকা উচিত @objc। (পূর্ববর্তী সংস্করণগুলিতে আপনি কিছু ক্ষেত্রে এই বৈশিষ্ট্যটি নিখরচায় পেয়েছিলেন তবে এখন আপনাকে এটি স্পষ্টভাবে ঘোষণা করতে হবে))

মনে রাখবেন যে privateচিহ্নগুলি রানটাইমের সাথেও প্রকাশিত হয় না - আপনার পদ্ধতির কমপক্ষে internalদৃশ্যমানতা থাকা দরকার।

মূল পথ: এগুলির সাথে সম্পর্কিত তবে নির্বাচকদের মতো নয়। এগুলির জন্য সুইফট 3-তে একটি বিশেষ বাক্য গঠন রয়েছে: যেমন chris.valueForKeyPath(#keyPath(Person.friends.firstName))। বিশদ জানতে SE-0062 দেখুন । এবং আরও KeyPathসুইফট 4 এ আরও স্টাফ , তাই আপনি যদি উপযুক্ত হন তবে নির্বাচকদের পরিবর্তে সঠিক কীপথ ভিত্তিক এপিআই ব্যবহার করছেন তা নিশ্চিত করুন।

আপনি অধীনে নির্বাচকরা সম্বন্ধে আরও পড়তে পারেন উদ্দেশ্য সি API গুলি সাথে আলাপচারিতার মধ্যে কোকো এবং উদ্দেশ্য সি সঙ্গে সুইফট ব্যবহার

দ্রষ্টব্য: সুইফট ২.২ এর আগে Selectorকনফর্ম করা হয়েছে StringLiteralConvertible, সুতরাং আপনি পুরানো কোডটি খুঁজে পেতে পারেন যেখানে নির্বাচকদের নেওয়া এআইপিগুলিতে খালি স্ট্রিংগুলি দেওয়া হয়। আপনি যেগুলি ব্যবহার করছেন তা পেতে এক্সকোডে "কনভার্ট টু কারেন্ট সুইট সিন্ট্যাক্স" চালাতে চান #selector


8
ফাংশনটির নামের সাথে একটি স্ট্রিং রেখে কাজ করা হয়েছে, এনএসএস ইলেক্টরফ্র্যামস্ট্রিং () এছাড়াও কাজ করে।
আরবিটুর

7
আমি উল্লেখ করতে চাই যে "অবজেক্টিভ-সি এপিআইগুলির সাথে ইন্টারঅ্যাক্টিং" ওয়েবসাইটে থাকা অবস্থায়, এটি 'দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ' বইয়ে নেই।

10
এটি সম্ভবত উল্লেখ করবে যে নির্বাচকটির যদি শেষে যুক্তি লাগে তবে ":" দরকার। (উদাহরণস্বরূপ পরীক্ষা () -> "পরীক্ষা" & পরীক্ষা (এটি: স্ট্রিং) -> "পরীক্ষা:")
ড্যানিয়েল শ্লাগ

2
এটিও উল্লেখ করা উচিত যে কোকো ফ্রেমওয়ার্কগুলি একটি উদ্দেশ্য-সি শৈলীর পদ্ধতির নাম আশা করে। আপনার পদ্ধতি একটি আর্গুমেন্ট লাগে তাহলে আপনি একটি প্রয়োজন হবে ':' যদি এটি 2 আর্গুমেন্ট লাগে, size:andShape:যদি প্রথম আর্গুমেন্ট নামকরণ করা হয় আপনি একটি প্রয়োজন হতে পারে With, অর্থাত্ initWithData:জন্যfunc init(Data data: NSData)
JMFR

6
"নির্বাচক" কে স্ট্রিং হিসাবে পাস করার চারপাশে বৈধতা যুক্ত করার উপায় আছে কি? IE সংকলক যখন আমরা ভুল বানান, ইত্যাদি আমাদের সতর্ক করে
yo.ian.g

86

Selectorসুইফটে ক্লাসটি কীভাবে ব্যবহার করতে হয় তার একটি দ্রুত উদাহরণ এখানে :

override func viewDidLoad() {
    super.viewDidLoad()

    var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))
    self.navigationItem.rightBarButtonItem = rightButton
}

func method() {
    // Something cool here   
}

নোট করুন যে স্ট্রিং হিসাবে পাস করা পদ্ধতিটি যদি কাজ না করে তবে এটি রানটাইম ব্যর্থ হবে, সময় সংকলন করবে না এবং আপনার অ্যাপ্লিকেশান ক্রাশ করবে। সাবধান হও


13
যা ভয়ঙ্কর ... সেখানে কি কোনও "এনএসএসস্ট্রিংফ্রোমস্লেক্টর" ধরণের জিনিস আছে?
লেনা ব্রু

11
বিশ্বাস করতে পারছেন না যে তারা চেক না করা নির্বাচনকারী নির্বাচকদের জন্য ডিজাইন করেছেন যেহেতু অজব্যাক এটি ছিল
মলহাল

4
@ কমলহল: @selectorসুবিধাজনক, তবে এটি যতটা ভাবেন ততটা আনুষ্ঠানিকভাবে প্রয়োগ করা হয়নি। "অঘোষিত নির্বাচক" কেবলমাত্র সংকলক থেকে একটি সতর্কতা, কারণ নতুন নির্বাচক সর্বদা রান সময় চালু করা যেতে পারে। স্যুইফ্টে যাচাইযোগ্য / পুনরুদ্ধারযোগ্য নির্বাচনের রেফারেন্সগুলি করা ভাল বৈশিষ্ট্যের অনুরোধ হবে
রিক্সার

2
এই উত্তরটি সহায়ক তবে @objc এর সাথে নীচের উত্তরটি আরও উপযুক্ত।
cynisterix

আপনি যখন ভেরিয়েবল বা প্যারামিটার হিসাবে নির্বাচক স্ট্রিংটি অতিক্রম করছেন তখন আপনাকে নির্বাচক () ফাংশনটি ব্যবহার করে সংকলকটিকে এটির নির্বাচককে জানাতে হবে। ধন্যবাদ
4:55

46

এছাড়াও, যদি আপনার (সুইফ্ট) শ্রেণিটি কোনও উদ্দেশ্য-সি শ্রেণীর থেকে না নেমে আসে, তবে আপনার অবশ্যই লক্ষ্য পদ্ধতি নামের স্ট্রিংয়ের শেষে একটি কোলন থাকতে হবে এবং আপনার লক্ষ্য পদ্ধতির সাথে অবশ্যই @objc সম্পত্তি ব্যবহার করতে হবে

var rightButton = UIBarButtonItem(title: "Title", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

@objc func method() {
    // Something cool here   
} 

অন্যথায় আপনি রানটাইমে একটি "অজ্ঞাত নির্বাচনকারী" ত্রুটি পাবেন।


3
১. নির্বাচকগণ ডাব্লু / কোলনকে অবশ্যই একটি যুক্তি নিতে হবে ২. অ্যাপল ডক্স অনুসারে টাইমারের ক্রিয়াকলাপগুলিতে এনএসটিমার যুক্তি নেওয়া উচিত 3.. Selectorকীওয়ার্ড বাধ্যতামূলক নয়। সুতরাং @objc func method(timer: NSTimer) {/*code*/}
এক্ষেত্রে

@objcআমার জন্য কাজ। timer: NSTimerএটি আহ্বানের জন্য আমার পদ্ধতির স্বাক্ষরে অন্তর্ভুক্ত করার দরকার নেই ।
মাইক তাভারনে

32

সুইফট 2.2+ এবং সুইফট 3 আপডেট

নতুন #selectorএক্সপ্রেশনটি ব্যবহার করুন , যা স্ট্রিং লিটারেলগুলি ব্যবহারকে কম ত্রুটি-প্রবণ করে তোলার প্রয়োজনটিকে সরিয়ে দেয়। রেফারেন্সের জন্য:

Selector("keyboardDidHide:")

হয়ে

#selector(keyboardDidHide(_:))

আরও দেখুন: সুইফট বিবর্তন প্রস্তাব

দ্রষ্টব্য (সুইফট 4.0):

যদি আপনার ব্যবহার করে #selectorতবে ফাংশনটি হিসাবে চিহ্নিত করতে হবে@objc

উদাহরণ:

@objc func something(_ sender: UIButton)


26

সুইফট 4.0

আপনি নীচের মত নির্বাচক তৈরি করুন।

1. ইভেন্টটি একটি বোতামে যুক্ত করুন:

button.addTarget(self, action: #selector(clickedButton(sender:)), for: UIControlEvents.touchUpInside)

এবং ফাংশন নীচের মত হবে:

@objc func clickedButton(sender: AnyObject) {

}

4
আপনি করা ভুলে গেছি @objcআগে funcযা সুইফট 4. প্রয়োজন হয়
Vahid আমিরি

24

ভবিষ্যতের পাঠকদের জন্য, আমি দেখতে পেয়েছি যে আমি একটি সমস্যার unrecognised selector sent to instanceমুখোমুখি হয়েছি এবং লক্ষ্যটি চিহ্নিত করার কারণে একটি ত্রুটি হয়েছেfunc ব্যক্তিগত হিসাবে ।

func হবে প্রকাশ্যে একটি নির্বাচক একটি রেফারেন্স সহ একটি বস্তু দ্বারা বলা যেতে কাছে দৃশ্যমান হতে।


13
এটা না আছে প্রকাশ্য আপনি এখনও পদ্ধতি গোপনীয় রাখতে কিন্তু যোগ করতে পারেন হতে objcএটা ঘোষণার আগে। @objc private func foo() { ..."foo"
উদাহরণ

এটি এমনও হতে পারে internal, সুতরাং কোনও অ্যাক্সেস মডিফায়ার নির্দিষ্ট করে না। আমি প্রায়শই এই প্যাটার্নটি ব্যবহার করি://MARK: - Selector Methods\n extension MyController {\n func buttonPressed(_ button: UIButton) {
Sajjon

19

এনএসটাইমারের সাথে আমার কারওর মতো একই সমস্যা রয়েছে যেখানে অন্য উত্তরগুলির মধ্যে কেউই এই সমস্যার সমাধান করেনি, তা উল্লেখ করা সত্যিই গুরুত্বপূর্ণ, আপনি যদি এনএসবজেক্ট থেকে উত্তরাধিকারসূত্রে না এমন শ্রেণি ব্যবহার করছেন যা হয় সরাসরি বা গভীরভাবে স্তরবিন্যাসের গভীরে ( উদাহরণস্বরূপ, ম্যানুয়ালি তৈরি সুইফট ফাইলগুলি), অন্যান্য উত্তরগুলির কোনওটি নীচে নির্দিষ্ট করা সত্ত্বেও কাজ করবে না:

let timer = NSTimer(timeInterval: 1, target: self, selector: "test", 
                    userInfo: nil, repeats: false)
func test () {}

ক্লাসটিকে এনএসবজেক্ট থেকে উত্তরাধিকারী করা ছাড়া অন্য কিছু পরিবর্তন না করে আমি "অচেনা নির্বাচক" ত্রুটি পাওয়া বন্ধ করে দিয়েছিলাম এবং আমার যুক্তিটি প্রত্যাশা অনুযায়ী কাজ করে চলেছি।


এই বিকল্পটির সাথে সমস্যাটি হ'ল আপনি ভিউকন্ট্রোলার শ্রেণি প্রয়োগ করা স্টাফের (যেমন ভিউডিডলড ()) প্রয়োজন হ'ল এনএসবজেক্ট থেকে উত্তরাধিকারী হওয়ার জন্য কোনও শ্রেণি (ভিউ কন্ট্রোলার বলুন) পরিবর্তন করতে পারবেন না। কোনও এনএসটিমিকার ব্যবহার করে একটি ভিউকন্ট্রোলারের অভ্যন্তরে একটি সুইফট ফাংশনটি কল করার কোনও ধারণা? ... ই
ইহারো 2

1
ইউআইভিউকন্ট্রোলার ইতিমধ্যে এনএসবজেক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, বেশিরভাগ ক্লাস এসডিকে দ্বারা প্রকাশিত, এই উদাহরণটি আপনার নিজের তৈরি ক্লাসগুলির জন্য যা এনএসটাইমার কার্যকারিতা প্রয়োজন ...
মার্টিন ক্যাজারেস

14

আপনি যদি এনটিএসটাইমার থেকে ফাংশনে কোনও প্যারামিটারটি পাস করতে চান তবে আপনার সমাধানটি এখানে:

var somethingToPass = "It worked"

let timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "tester:", userInfo: somethingToPass, repeats: false)

func tester(timer: NSTimer)
{
    let theStringToPrint = timer.userInfo as String
    println(theStringToPrint)
}

নির্বাচক পাঠ্য (পরীক্ষক :) এ কোলন অন্তর্ভুক্ত করুন এবং আপনার প্যারামিটার ব্যবহারকারীর ইনফোতে যান।

আপনার ফাংশনটি প্যারামিটার হিসাবে NSTimer গ্রহণ করা উচিত। তারপরে পাস হওয়া প্যারামিটারটি পেতে কেবল ব্যবহারকারীআইনফোরটি বের করুন।


3
আমি এনএসটিমার (0.01, টার্গেট: স্ব, ...) ব্যবহার করছিলাম যা কাজ করে না, যেখানে এনএসটিআমিআরএসসিডুয়ালটাইমওয়াইথটাইমইন্টারওয়াল (0.01, ..) ব্যবহার করেছেন !? অদ্ভুত তবে আপনাকে উত্তর দেওয়ার জন্য @ স্কুটার ধন্যবাদ!
আইওএস-কোডার

1
@ আইওএস-কোডার ইনিশিয়ালাইজারের সাথে কেবল টাইমার তৈরি করা এটি কোনও রানলুপে যুক্ত করে না, যেখানে scheduledTimerWith...এটি স্বয়ংক্রিয়ভাবে বর্তমান রানলুপে যুক্ত হয় - সুতরাং এখানে কোনও অদ্ভুত আচরণ নেই;)
ডেভিড গ্যানস্টার

1
@ ডেভিড আপনার পরামর্শের জন্য ধন্যবাদ আমার ধারণা আমার ভুল বোঝাবুঝি এসটিএফডাব্লু বা আরটিএফএ (এফ ... আইএনপি এপিআই পড়ুন) বিভাগের অন্তর্ভুক্ত হওয়া উচিত?
আইওএস-কোডার

1
এটি নিয়ে চিন্তা করবেন না, প্রতিটি এপিআই-তে প্রতিটি পদ্ধতি সম্পর্কে ডকুমেন্টেশন পড়ার আশা করা যায় না;)
ডেভিড গ্যানস্টার

10

নির্বাচকরা উদ্দেশ্য-সি-তে একটি পদ্ধতির নামের অভ্যন্তরীণ উপস্থাপনা। অবজেক্টিভ-সিতে "@ সিলেক্টর (মেথডনাম)" একটি উত্স-কোড পদ্ধতিকে এসইএল-এর একটি ডেটা ধরণের রূপান্তরিত করে। যেহেতু আপনি সুইফটে @ নির্বাচক সিনট্যাক্সটি ব্যবহার করতে পারবেন না (রিক্সারটি সেখানে রয়েছে), আপনাকে নিজেই পদ্ধতিটির নামটি সরাসরি স্ট্রিং অবজেক্ট হিসাবে নির্দিষ্ট করতে হবে, বা একটি স্ট্রিং অবজেক্টকে নির্বাচক ধরণের মাধ্যমে পাস করতে হবে। এখানে একটি উদাহরণ:

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:"logout"
)

অথবা

var rightBarButton = UIBarButtonItem(
    title: "Logout", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:Selector("logout")
)

8


টেপ অঙ্গভঙ্গির নমুনা সহ সুইফট 4.1

let gestureRecognizer = UITapGestureRecognizer()
self.view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.addTarget(self, action: #selector(self.dismiss(completion:)))

// Use destination 'Class Name' directly, if you selector (function) is not in same class.
//gestureRecognizer.addTarget(self, action: #selector(DestinationClass.dismiss(completion:)))


@objc func dismiss(completion: (() -> Void)?) {
      self.dismiss(animated: true, completion: completion)
}

এ সম্পর্কিত আরও তথ্যের জন্য অ্যাপলের নথিটি দেখুন: নির্বাচক এক্সপ্রেশন


দয়া করে এটি করা বন্ধ করুন। এটি কাউকে সাহায্য করে না। এটি কীভাবে সুইফট ৩.১ এর থেকে আলাদা? এবং ইতিমধ্যে প্রায় 20 টি উত্তর থাকলে আপনি কেন এটির জন্য অন্য একটি উত্তর যুক্ত করার প্রয়োজন মনে করেছিলেন?
ফোগমিস্টার

কলিং সিলেক্টর দ্রুতগতিতে ভিন্ন 4 these উত্তরগুলি সুইফট 4 এ চেষ্টা করে দেখুন। এগুলি কিছুই সম্পাদনা ব্যতীত কাজ করবে না। দয়া করে কোনও বক্তব্যকে এর নব্যতা নিশ্চিত না করে স্প্যাম হিসাবে চিহ্নিত করবেন না
ক্রুনাল

সুতরাং কোনও বিদ্যমান কারণ আপনি বিদ্যমান, স্বীকৃত উত্তর সম্পাদনা করতে পারেন নি? এটি উত্তরগুলির দীর্ঘ তালিকার শেষে যুক্ত করার পরিবর্তে এটি আসলে দরকারী করে তুলবে। "সম্পাদনা" বোতামটি একটি কারণে রয়েছে।
ফগমিস্টার

এছাড়াও, এর কোন অংশটি সুইফট 3 এর চেয়ে আলাদা?
ফগমিস্টার

2
আপনি সুইফট ৪-এর জন্য যে কোনও নির্বাচককে ওজেক্ট ট্যাগ যুক্ত করতে হবে এটি সঠিক উত্তর। এবং আপনার অর্থ পরিবর্তনের জন্য অন্যদের উত্তরগুলির সম্পাদনা করার কথা নয়। @ ক্রুনাল সম্পূর্ণ সঠিক।
আনোম

6
// for swift 2.2
// version 1
buttton.addTarget(self, action: #selector(ViewController.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(ViewController.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 2
buttton.addTarget(self, action: #selector(self.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(self.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 3
buttton.addTarget(self, action: #selector(tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(tappedButton2(_:)), forControlEvents: .TouchUpInside)

func tappedButton() {
  print("tapped")
}

func tappedButton2(sender: UIButton) {
  print("tapped 2")
}

// swift 3.x
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton) {
  // tapped
}

button.addTarget(self, action: #selector(tappedButton(_:_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton, _ event: UIEvent) {
  // tapped
}

আপনি যদি সুইফট 3 বা সুইফট 4-এর জন্যও দুটি বা তিনটি যুক্তি গ্রহণের উদাহরণ পেয়ে থাকেন তবে এটি আরও ভাল এবং আরও শিক্ষামূলক হত। ধন্যবাদ।
nyxee

5
Create Refresh control using Selector method.   
    var refreshCntrl : UIRefreshControl!
    refreshCntrl = UIRefreshControl()
    refreshCntrl.tintColor = UIColor.whiteColor()
    refreshCntrl.attributedTitle = NSAttributedString(string: "Please Wait...")
    refreshCntrl.addTarget(self, action:"refreshControlValueChanged", forControlEvents: UIControlEvents.ValueChanged)
    atableView.addSubview(refreshCntrl)

// রিফ্রেশ নিয়ন্ত্রণের পদ্ধতি

func refreshControlValueChanged(){
    atableView.reloadData()
    refreshCntrl.endRefreshing()

}

5

যেহেতু সুইফট ৩.০ প্রকাশিত হয়েছে, তাই টার্গেটএকশনটিকে যথাযথভাবে ঘোষণা করা আরও খানিকটা সূক্ষ্ম

class MyCustomView : UIView {

    func addTapGestureRecognizer() {

        // the "_" is important
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyCustomView.handleTapGesture(_:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        addGestureRecognizer(tapGestureRecognizer)
    }

    // since Swift 3.0 this "_" in the method implementation is very important to 
    // let the selector understand the targetAction
    func handleTapGesture(_ tapGesture : UITapGestureRecognizer) {

        if tapGesture.state == .ended {
            print("TapGesture detected")
        }
    }
}

4

ব্যবহার করার সময় performSelector()

/addtarget()/NStimer.scheduledTimerWithInterval() পদ্ধতিগুলি আপনার পদ্ধতি (নির্বাচকটির সাথে মিলে যাওয়া) হিসাবে চিহ্নিত করা উচিত

@objc
For Swift 2.0:
    {  
        //...
        self.performSelector(“performMethod”, withObject: nil , afterDelay: 0.5)
        //...


    //...
    btnHome.addTarget(self, action: “buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    //...

    //...
     NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector : “timerMethod”, userInfo: nil, repeats: false)
    //...

}

@objc private func performMethod() {}
@objc private func buttonPressed(sender:UIButton){.
}
@objc private func timerMethod () {.
}

সুইফট ২.২ এর জন্য আপনাকে স্ট্রিং এবং নির্বাচক নামের পরিবর্তে '# নির্বাচক ()' লিখতে হবে যাতে বানানের ত্রুটি এবং ক্র্যাশ হওয়ার কারণে এর সম্ভাবনা আর থাকবে না। নীচে উদাহরণ

self.performSelector(#selector(MyClass.performMethod), withObject: nil , afterDelay: 0.5)

3

আপনি নীচের মত নির্বাচক তৈরি করুন।
1।

UIBarButtonItem(
    title: "Some Title",
    style: UIBarButtonItemStyle.Done,
    target: self,
    action: "flatButtonPressed"
)

2।

flatButton.addTarget(self, action: "flatButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)

নোট করুন যে @ সিলেক্টর সিনট্যাক্সটি চলে গেছে এবং কল করার পদ্ধতিটির নামকরণ করে একটি সাধারণ স্ট্রিং দিয়ে প্রতিস্থাপন করা হয়েছে। একটি ক্ষেত্র রয়েছে যেখানে আমরা সকলে সম্মতি জানাতে পারি যে পথে পেয়েছিল। অবশ্যই, যদি আমরা ঘোষণা করি যে ফ্ল্যাটবটন প্রেসিড নামে একটি টার্গেট পদ্ধতি রয়েছে: আমরা আরও ভালভাবে একটি লিখি:

func flatButtonPressed(sender: AnyObject) {
  NSLog("flatButtonPressed")
}

টাইমার সেট করুন:

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, 
                    target: self, 
                    selector: Selector("flatButtonPressed"), 
                    userInfo: userInfo, 
                    repeats: true)
    let mainLoop = NSRunLoop.mainRunLoop()  //1
    mainLoop.addTimer(timer, forMode: NSDefaultRunLoopMode) //2 this two line is optinal

সম্পূর্ণ হওয়ার জন্য, এখানে ফ্ল্যাটবটনপ্রেসড

func flatButtonPressed(timer: NSTimer) {
}

" @ নির্বাচক বাক্য গঠনটি নষ্ট হয়ে গেছে " নোটটি নেওয়ার জন্য আপনার কি কোনও উত্স আছে ?
উইংকলার

3

আমি এই উত্তরগুলির বেশিরভাগকে সহায়ক বলে মনে করেছি তবে এটি কীভাবে কীভাবে এটি করা যায় তা বোতাম নয়। আমি দ্রুতগতিতে একটি ইউআইএলবেলে একটি অঙ্গভঙ্গি শনাক্তকারী যুক্ত করছিলাম এবং লড়াই করেছি তাই উপরের সমস্ত কিছু পড়ার পরে আমার জন্য যা কাজ করেছে তা এখানেই লিখেছি:

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: "labelTapped:")

যেখানে "নির্বাচক" ঘোষণা করা হয়েছিল:

func labelTapped(sender: UILabel) { }

মনে রাখবেন যে এটি সর্বজনীন এবং আমি নির্বাচক () সিনট্যাক্সটি ব্যবহার করছি না তবে এটি করাও সম্ভব।

let tapRecognizer = UITapGestureRecognizer(
            target: self,
            action: Selector("labelTapped:"))

3

# সিলেক্টর ব্যবহার করে সংকলনের সময় আপনার কোডটি যাচাই করতে হবে যে আপনি যে পদ্ধতিতে কল করতে চান তা বাস্তবে বিদ্যমান আছে কিনা তা নিশ্চিত করে। আরও ভাল, যদি পদ্ধতিটি বিদ্যমান না থাকে তবে আপনি একটি সংকলন ত্রুটি পাবেন: এক্সকড আপনার অ্যাপ্লিকেশন তৈরি করতে অস্বীকার করবে, ফলে বাগের সম্ভাব্য উত্সটিকে বিসর্জন দেওয়া হবে।

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem =
            UIBarButtonItem(barButtonSystemItem: .Add, target: self,
                            action: #selector(addNewFireflyRefernce))
    }

    func addNewFireflyReference() {
        gratuitousReferences.append("Curse your sudden but inevitable betrayal!")
    }

2

আপনি যেখানে ক্রিয়াকলাপের বিষয়গুলিকে ট্রিগার করে এমন নিয়ন্ত্রণটি কোথায় সেটআপ করেছেন তা লক্ষ করা দরকারী।

উদাহরণস্বরূপ, আমি খুঁজে পেয়েছি যে একটি ইউআইবারবারটন আইটেম সেট আপ করার সময় আমাকে ভিউডিডলয়েডের মধ্যে বোতামটি তৈরি করতে হয়েছিল অথবা অন্যথায় আমি একটি অবিজ্ঞাত নির্বাচক ব্যতিক্রম পেতে পারি।

override func viewDidLoad() {
    super.viewDidLoad() 

    // add button
    let addButton = UIBarButtonItem(image: UIImage(named: "746-plus-circle.png"), style: UIBarButtonItemStyle.Plain, target: self, action: Selector("addAction:"))
    self.navigationItem.rightBarButtonItem = addButton
}

func addAction(send: AnyObject?) {     
    NSLog("addAction")
}

1

নির্বাচক সিনট্যাক্সের জন্য কল করার পদ্ধতিটিতে সাধারণ স্ট্রিংয়ের নাম হিসাবে পরিবর্তন করুন

var timer1 : NSTimer? = nil
timer1= NSTimer(timeInterval: 0.1, target: self, selector: Selector("test"), userInfo: nil, repeats: true)

এর পরে, ফানক পরীক্ষা () টাইপ করুন।


1

selectorথেকে একটি শব্দ Objective-Cবিশ্বের এবং আপনার কাছ থেকে এটি ব্যবহার করতে পারবেন Swiftকল একটি সম্ভাবনা আছে Objective-CথেকেSwift এটা আপনাকে রানটাইম কিছু কোড এক্সিকিউট করার অনুমতি দেয়

Swift 2.2সিনট্যাক্স হওয়ার আগে :

Selector("foo:")

যেহেতু কোনও ফাংশনের নাম Selectorস্ট্রিং প্যারামিটার ("foo") হিসাবে প্রেরণ করা হয়েছে সংকলনের সময় কোনও নাম চেক করা সম্ভব নয় । ফলস্বরূপ আপনি রানটাইম ত্রুটি পেতে পারেন :

unrecognized selector sent to instance

Swift 2.2+সিনট্যাক্স হওয়ার পরে :

#selector(foo(_:))

এক্সকোডের স্বতঃপূরণ আপনাকে একটি সঠিক পদ্ধতিতে কল করতে সহায়তা করে


0

সুইফট 3 এর জন্য

// টাইমার তৈরির জন্য নমুনা কোড

Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)

WHERE
timeInterval:- Interval in which timer should fire like 1s, 10s, 100s etc. [Its value is in secs]
target:- function which pointed to class. So here I am pointing to current class.
selector:- function that will execute when timer fires.

func updateTimer(){
    //Implemetation 
} 

repeats:- true/false specifies that timer should call again n again.


-1

দ্রুত 3 জন্য

let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.test), userInfo: nil, repeats: true)

একই শ্রেণিতে ফাংশন ঘোষণা:

@objc func test()
{
    // my function
} 

যদি লক্ষ্যটি স্বয়ং হয়, তবে selfনির্বাচক হওয়ার দরকার নেই। এটি যথেষ্ট হওয়া উচিত:let timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(test), userInfo: nil, repeats: true)
মিত্রা সিংগাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.