বোতামে পরামিতি যুক্ত করুন


106

আমি বোতামটি ক্লিক করা ক্রিয়াকলাপে একটি অতিরিক্ত পরামিতি দেওয়ার চেষ্টা করছি, তবে সুইফটে সিনট্যাক্সটি কী হবে তা কার্যকর করতে পারছি না।

button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

যে কোনও আমার বোতাম ক্লিক পদ্ধতি:

func buttonClicked(sender:UIButton)
{
    println("hello")
}

কেউ কোন ধারণা?

আপনার সাহায্যের জন্য ধন্যবাদ.


4
পড়ুন এই লিঙ্কে বিস্তারিত উত্তর এবং সেরা অনুশীলনের জন্য
শীতল

প্রশ্নের ইতিমধ্যে একটি ভাল উত্তর নেই কারণ এটি ইতিমধ্যে একটি সমস্যাযুক্ত আর্কিটেকচার বর্ণনা করে। আপনার অতিরিক্ত প্যারামিটারের দরকার নেই। অতিরিক্ত প্যারামিটারের প্রয়োজন আপনার আর্কিটেকচারে একটি সমস্যা is
সুলতান

WARNING TO INTERNET: please check out my answer at the bottom
মিঃ হিলিস

উত্তর:


170

আপনি কাস্টম পরামিতি প্রেরণ করতে পারবেন না addTarget:.One বিকল্প সেট করা হয় tagট্যাগ উপর ভিত্তি করে বোতামের সম্পত্তি কাজ এবং না।

button.tag = 5
button.addTarget(self, action: "buttonClicked:", 
    forControlEvents: UIControlEvents.TouchUpInside)

বা সুইফট ২.২ এবং এর চেয়ে বেশি এর জন্য:

button.tag = 5
button.addTarget(self,action:#selector(buttonClicked),
    forControlEvents:.TouchUpInside)

এখন tagসম্পত্তি উপর ভিত্তি করে যুক্তি না

@objc func buttonClicked(sender:UIButton)
{
    if(sender.tag == 5){

        var abc = "argOne" //Do something for tag 5
    }
    print("hello")
}

4
হাই, আমি যদি টেবিল ভিউতে ইনডেক্সপথ বা বোতামের সেল পেতে চাই, তবে এটি কি সম্ভব?
এনকুরপাতি

4
এখানে একটি ইঙ্গিত দেওয়া হয়েছে: পদ্ধতিটি ব্যক্তিগত করবেন না।
ওহাদএম

4
দেখে মনে হচ্ছে এটির টাইপটি কেবল একটি হতে পারে Int। আর কিছু না.
scaryguy

4
আমি কি সারি এবং বিভাগ একসাথে পাস করতে চান?
ইয়েস্টে মুরাতভ

4
ঠিক তাই আপনি জানেন, 118 টি আপত্তির পরেও (এবং গণনা করা) এটি করা এটিই ভুল উপায়
মিঃ হেলিস

79

আপনি যদি বাটন ক্লিক পদ্ধতিতে অতিরিক্ত প্যারামিটারগুলি প্রেরণ করতে চান, উদাহরণস্বরূপ একটি সূচিপথ বা urlString, আপনি UIButton সাবক্লাস করতে পারেন:

class SubclassedUIButton: UIButton {
    var indexPath: Int?
    var urlString: String?
}

পরিচয় পরিদর্শকটির বোতামের শ্রেণিটি সাবক্ল্যাসড ইউআই বাটনে পরিবর্তন করতে নিশ্চিত করুন। আপনি sender.indexPathবা বোতাম ক্লিক পদ্ধতি ব্যবহার করে প্যারামিটার অ্যাক্সেস করতে পারেন sender.urlString

দ্রষ্টব্য: যদি আপনার বোতামটি কোনও কক্ষের অভ্যন্তরে থাকে তবে আপনি এই অতিরিক্ত প্যারামিটারের মানটি সেলফোর্ডআউটইন্টেক্সপথ পদ্ধতিতে (যেখানে বোতামটি তৈরি করা হয়েছে) সেট করতে পারেন।


6
এটি আমার পক্ষে কাজ করার একমাত্র উপায় ছিল। তবে আমি কৌতূহলী, এটি কি বিন্যাসবিরোধী নাকি?
scaryguy

4
এটি আমার পক্ষে সেরা উপায়,
ডু হোয়াং

29

আমি প্রত্যেককে ট্যাগ ব্যবহারের প্রশংসা করি, তবে সত্যিই আপনাকে ইউআইবাটন ক্লাসটি প্রসারিত করতে হবে এবং কেবলমাত্র সেখানে অবজেক্ট যুক্ত করতে হবে ..

ট্যাগগুলি এই আশেপাশে একটি নিরাশ উপায়। এটির মতো ইউআইবাটনটি প্রসারিত করুন (সুইফ্ট 4 এ)

import UIKit
class PassableUIButton: UIButton{
    var params: Dictionary<String, Any>
    override init(frame: CGRect) {
        self.params = [:]
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        self.params = [:]
        super.init(coder: aDecoder)
    }
}

তারপরে আপনার কলটি কল হতে পারে (কল্ট নোট করুন ":" ইন Selector(("webButtonTouched:")))

let webButton = PassableUIButton(frame: CGRect(x:310, y:40, width:40, height:40))
webButton.setTitle("Visit",for: .normal)
webButton.addTarget(self, action: #selector(YourViewController.webButtonTouched(_:)), for:.touchUpInside)
webButton.params["myvalue"] = "bob"

তাহলে সবশেষে এখানে ধর

@IBAction func webButtonTouched(_ sender: PassableUIButton) {
    print(sender.params["myvalue"] ?? "")
}

আপনি এটি একবার ব্যবহার করেন এবং আপনার পুরো প্রকল্প জুড়ে এটি ব্যবহার করুন (এমনকি আপনি শিশু শ্রেণিকে জেনেরিক "অবজেক্ট" তৈরি করতে পারেন এবং যা যা পছন্দ করুন বোতামে রেখে দিতে পারেন!)। বা বাটনটিতে একটি অক্ষয় সংখ্যক কী / স্ট্রিং প্যারাম রাখার জন্য উপরের উদাহরণটি ব্যবহার করুন .. ইউআরএল, বার্তা নিশ্চিতকরণের পদ্ধতি ইত্যাদি নিশ্চিত করার মতো জিনিসগুলির জন্য সত্যই কার্যকর

একদিকে যেমন, এটি গুরুত্বপূর্ণ যে SOসম্প্রদায়টি বুঝতে পারে যে এটি একটি সম্পূর্ণ প্রজন্মের ইন্টারনেটের চারপাশে কাটানো খারাপ অনুশীলন রয়েছে যা এমন প্রোগ্রামারদের দ্বারা বোঝা যায় না যারা বুঝতে পারে না / শেখানো হয়নি / বিন্দুটি মিস করে নি ধারণাobject extensions


10

সুইফট ৩.০ এর জন্য আপনি নিম্নলিখিত ব্যবহার করতে পারেন

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

func YourMethodName(_ sender : UIButton) {
    print(sender.tag)

}

9

সুইফট 4.2

ফলাফল:

testButton.on(.touchUpInside) { (sender, event) in
    // You can use any reference initialized before the code block here
    // You can access self by adding [weak self] before (sender, event)
    // You can then either make self strong by using a guard statement or use a optional operator (?)
    print("user did press test button")
}

ফাইলটিতে UIButton+Events.swiftআমি UIButtonএটির জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করেছি যার সাথে UIControl.Eventএকটি সম্পূর্ণতা হ্যান্ডলার বলা হয় EventHandler:

import UIKit

fileprivate var bindedEvents: [UIButton:EventBinder] = [:]

fileprivate class EventBinder {

    let event: UIControl.Event
    let button: UIButton
    let handler: UIButton.EventHandler
    let selector: Selector

    required init(
        _ event: UIControl.Event,
        on button: UIButton,
        withHandler handler: @escaping UIButton.EventHandler
    ) {
        self.event = event
        self.button = button
        self.handler = handler
        self.selector = #selector(performEvent(on:ofType:))
        button.addTarget(self, action: self.selector, for: event)
    }

    deinit {
        button.removeTarget(self, action: selector, for: event)
        if let index = bindedEvents.index(forKey: button) {
            bindedEvents.remove(at: index)
        }
    }
}

private extension EventBinder {

    @objc func performEvent(on sender: UIButton, ofType event: UIControl.Event) {
        handler(sender, event)
    }
}

extension UIButton {

    typealias EventHandler = (UIButton, UIControl.Event) -> Void

    func on(_ event: UIControl.Event, handler: @escaping EventHandler) {
        bindedEvents[self] = EventBinder(event, on: self, withHandler: handler)
    }
}

ইভেন্টটি বাঁধার জন্য আমি কাস্টম ক্লাসটি যে কারণে ব্যবহার করেছি তা হল বোতামটি যখন নির্দিষ্ট করা হয় তখন পরে রেফারেন্সটি নিষ্পত্তি করতে সক্ষম হয়। এটি সম্ভাব্য মেমরি ফুটো হওয়া থেকে রোধ করবে। UIButtonএটির সম্প্রসারণের মধ্যে এটি সম্ভব ছিল না , কারণ আমাকে কোনও সম্পত্তি বা deinitপদ্ধতি প্রয়োগ করার অনুমতি নেই ।


2

আপনার মতো আমার মতো বোতামগুলির লুপ থাকলে আপনি এটির মতো কিছু চেষ্টা করতে পারেন

var buttonTags:[Int:String]? // can be [Int:Any]
let myArray = [0:"a",1:"b"]
for (index,value) in myArray {

     let button = // Create a button

     buttonTags?[index] = myArray[index]
     button.tag = index
     button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchDown)

}
@objc func buttonAction(_ sender:UIButton) {

    let myString = buttonTags[sender.tag]

}

2

সুইফট code.০ কোড (এখানে আমরা আবার যাই)

ডাকা অ্যাকশনটি এটির মতো চিহ্নিত করা উচিত কারণ এটি উদ্দেশ্য সি ভাষায় ফাংশন রফতানি করার জন্য সুইফট ফাংশনের সিনট্যাক্স।

@objc func deleteAction(sender: UIButton) {
}

কিছু কাজের বোতাম তৈরি করুন:

let deleteButton = UIButton(type: .roundedRect)
deleteButton.setTitle("Delete", for: [])
deleteButton.addTarget(self, action: #selector( 
MyController.deleteAction(sender:)), for: .touchUpInside)

ভাগ করে নেওয়ার জন্য ধন্যবাদ. এটি কাজ করে, তবে @objc এর সাথে চিহ্নিত করা অনুপযুক্ত অনুভব করে। আপনি কি এর যুক্তি ব্যাখ্যা করতে পারেন?
কাঁচাবি

@ আরউবি সম্মত হন যে এটি প্রতিদ্বন্দ্বী। : এই প্রশ্নের আরো ব্যাকগ্রাউন্ড আছে stackoverflow.com/questions/44390378/...
Mikrasya

1

সুইফ্ট 5.0 কোড

আমি বাটন.ট্যাগ ব্যবহার করি তবে আমার কাছে প্রচুর ধরণের বিকল্প থাকলে এটি খুব দীর্ঘ সুইচ কেস হতে পারে।

theButton.addTarget(self, action: #selector(theFunc), for: .touchUpInside) 
theButton.frame.name = "myParameter"

@objc func theFunc(sender:UIButton){ 
print(sender.frame.name)
}

0

উপরের সুইফট 2. এক্স এবং এর জন্য

button.addTarget(self,action:#selector(YourControllerName.buttonClicked(_:)),
                         forControlEvents:.TouchUpInside)

0

সুইফট 3.0.০ কোড

self.timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector:#selector(fetchAutocompletePlaces(timer:)), userInfo:[textView.text], repeats: true)

func fetchAutocompletePlaces(timer : Timer) {

  let keyword = timer.userInfo
}

আপনি 'userinfo' এ মান প্রেরণ করতে পারেন এবং এটি ফাংশনে প্যারামিটার হিসাবে ব্যবহার করতে পারেন।


0

এটি একটি গুরুত্বপূর্ণ মন্তব্য আরও। বাক্সের বাইরে গ্রহণযোগ্য সিট্যানেক্সের রেফারেন্সগুলি ভাগ করে নেওয়া। হ্যাক সমাধানের জন্য অন্যান্য উত্তরগুলি দেখুন।

অ্যাপলের ডক্স অনুসারে, অ্যাকশন মেথড সংজ্ঞাগুলি এই তিনটির মধ্যে একটি হতে হবে। অন্য কিছু অগ্রহণযোগ্য।

@IBAction func doSomething()
@IBAction func doSomething(sender: UIButton)
@IBAction func doSomething(sender: UIButton, forEvent event: UIEvent)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.