'# নির্বাচক' এমন একটি পদ্ধতিকে বোঝায় যা অবজেক্টিভ-সি-তে প্রকাশিত হয় না


105

নতুন এক্সকোড 7.3 অ্যাডটারেটের মাধ্যমে প্যারামিটারটি পাস করা সাধারণত আমার পক্ষে কাজ করে তবে এই ক্ষেত্রে এটি শিরোনামটিতে ত্রুটি ছুঁড়ে ফেলেছে। কোন ধারনা? যখন আমি এটি @objc এ পরিবর্তন করার চেষ্টা করি তখন এটি অন্যটিকে ছুঁড়ে দেয়

ধন্যবাদ!

cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)

নির্বাচক এটি কল করছে

func didTapCommentButton(post: Post) {
}

3
ফিডভিউকন্ট্রোলারের শ্রেণির ঘোষণার রেখাটি দেখতে কেমন? টেপকমেন্টমেন্ট বাটন কীভাবে ঘোষিত হয়? আপনি @objc যোগ করার পরে কোন ত্রুটি পাবেন?
ভ্যাকোয়ামা

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

2
আপনার শ্রেণি ঘোষণা করে @objc, বা এটি একটি সাবক্লাস NSObject?
এনআরটিএইচ

2
আপনি বন্ধনীগুলি সরানোর চেষ্টা করতে পারেন? আপনি কোনও নির্বাচকের কোনও ফাংশন কল করা উচিত নয় এটি বিবেচনা করা অস্বাভাবিক।
ড্যানিয়েল এড্রিসিয়ান

এটি আমার দ্বিতীয় সমস্যার সমাধান করেছে http://stackoverflow.com/a/36963058/1685165
ডার্কো

উত্তর:


173

আমার ক্ষেত্রে নির্বাচকটির কাজ ছিল private। আমি একবার মুছে privateফেললে ত্রুটিটি চলে গেল। একই জন্য যায় fileprivate

সুইফ্ট 4 এ
আপনাকে @objcফাংশন ঘোষণায় যুক্ত করতে হবে । সুইফ্ট 4 অবধি এই বিষয়টি স্পষ্টভাবে অনুমান করা হয়েছিল।


2
এ ছাড়াও fileprivate
এইচএসডিটি

দুর্দান্ত ক্যাচ @ শেকড
jbouaziz

@ hstdt, তাই যদি আপনি সেট করেন তবে কি fileprivateতা সমাধান হবে?
হেমং

2
না, @Hemang, তার মানে তন্ন তন্ন @hstdt privateকিংবা fileprivateকাজ করবে
Gobe থেকে

প্রাইভেট / ফাইলপ্রাইভেট অপসারণের চেয়ে ডায়নামিক দিয়ে ফান বানানো আরও উপযুক্ত appropriate
বুন

57

এটি ব্যবহার করতে আপনাকে @objcএট্রিবিউটটি didTapCommentButton(_:)ব্যবহার করতে হবে #selector

আপনি বলছেন যে আপনি এটি করেছেন তবে আপনি অন্য একটি ত্রুটি পেয়েছেন। আমার অনুমান যে নতুন ত্রুটিটি হ'ল এটি Postকোনও ধরণের নয় যা উদ্দেশ্য-সি এর সাথে সামঞ্জস্যপূর্ণ। আপনি কেবল কোনও উদ্দেশ্যটি-সি-তে উদ্ঘাটিত করতে পারেন যদি এর সমস্ত যুক্তি ধরণের এবং তার ফেরতের প্রকারগুলি উদ্দেশ্য-সি এর সাথে সামঞ্জস্য করে।

আপনি Postএটির একটি সাবক্লাস তৈরি করে এটি ঠিক করতে পারেন NSObject, তবে এটি কোনও বিষয় নয়, কারণ তর্কটি কোনওভাবেই didTapCommentButton(_:)হবে না Post। একটি কর্ম ফাংশন আর্গুমেন্ট প্রেরক কর্মের, এবং যে প্রেরক হতে হবে commentButton, যা একটি সম্ভবতঃ হয় UIButton। আপনার didTapCommentButtonএই মত ঘোষণা করা উচিত :

@objc func didTapCommentButton(sender: UIButton) {
    // ...
}

তারপরে আপনি Postটেপযুক্ত বোতামটির সাথে সম্পর্কিত হওয়ার সমস্যার মুখোমুখি হবেন । এটি পাওয়ার একাধিক উপায় রয়েছে। এখানে একটি।

আমি সংগ্রহ করি (যেহেতু আপনার কোড বলছে cell.commentButton) যে আপনি একটি সারণী দর্শন (বা একটি সংগ্রহের দৃশ্য) সেট আপ করছেন। এবং যেহেতু আপনার ঘরের একটি অ-মানক সম্পত্তি রয়েছে commentButton, তাই আমি ধরে নিলাম এটি একটি কাস্টম UITableViewCellসাবক্লাস। সুতরাং আসুন ধরে নেওয়া যাক আপনার সেলটি এর PostCellমতো ঘোষিত:

class PostCell: UITableViewCell {
    @IBOutlet var commentButton: UIButton?
    var post: Post?

    // other stuff...
}

তারপরে আপনি এটিটি সন্ধান করতে বোতাম থেকে দর্শন শ্রেণিবিন্যাসটি সন্ধান করতে পারেন এবং এটি PostCellথেকে পোস্টটি পেতে পারেন:

@objc func didTapCommentButton(sender: UIButton) {
    var ancestor = sender.superview
    while ancestor != nil && !(ancestor! is PostCell) {
        ancestor = view.superview
    }
    guard let cell = ancestor as? PostCell,
        post = cell.post
        else { return }

    // Do something with post here
}

আমি যদি বিশ্বব্যাপী ফাংশন দিয়ে এটি ব্যবহার করতে চাই? @objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
টমসওয়ায়ার

আপনি এটি কোনও বৈশ্বিক ফাংশন সহ ব্যবহার করতে পারবেন না।
রব মায়ফ

8

নির্বাচকটিকে মোড়ক ফাংশনের দিকে নিয়ে যাওয়ার চেষ্টা করুন, যার ফলস্বরূপ আপনার প্রতিনিধি ফাংশনটি কল করে। এটা আমার জন্য কাজ করেছে।

cell.commentButton.addTarget(self, action: #selector(wrapperForDidTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)

-

func wrapperForDidTapCommentButton(post: Post) {
     FeedViewController.didTapCommentButton(post)
}

1
আমার জন্য কাজ! কেন এটি প্রয়োজনীয় তা এখনও নিশ্চিত নয় তবে আমি এটি গ্রহণ করব!
পল লেহন

0

আপনি যেমন জানেন selector[সম্পর্কে] বলেছেন যে Objective-Cরানটাইম ব্যবহার করা উচিত। ডিফল্টরূপে অবজেক্টিভ-সি রানটাইম হিসাবে চিহ্নিত privateবা fileprivateপ্রকাশিত হয় না এমন ঘোষণাগুলি । এজন্য আপনার দুটি রূপ রয়েছে:

  1. আপনার privateবা fileprivateঘোষণাটি চিহ্নিত করুন @objc[সম্পর্কে]
  2. ব্যবহারের internal, public, openএক্সেস পরিবর্তক [সম্বন্ধে]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.