উদ্দেশ্য-সি: একাধিক যুক্তি সহ নির্বাচকদের কল করা


142

মাইক্লাস.এম-এ, আমি সংজ্ঞা দিয়েছি

- (void) myTest: (NSString *) withAString{
    NSLog(@"hi, %@", withAString);
}

এবং MyClass.h এ যথাযথ ঘোষণা। পরে আমি কল করতে চাই

[self performSelector:@selector(mytest:withAString:) withObject: mystring];

মাইক্লাস.এম তে তবে আমি অপসারণ ব্যতীত 'এনএসআইঅন্যাল্টিআরগমেন্ট এক্সেক্সেশন' এর কারণে * অ্যাপ্লিকেশন টার্মিনেটের অনুরূপ একটি ত্রুটি পেয়েছি, কারণ: '* - [মাই ক্লাস মাই টেস্ট: উইথআটারিং:]: অজানা নির্বাচককে উদাহরণ 0xe421f0' তে প্রেরণ করা হয়েছে '

আমি একজন নির্বাচকের সাথে একটি সহজ কেস চেষ্টা করেছি যা কনসোলে স্ট্রিং প্রিন্ট করে এমন কোনও যুক্তি নিল না যে এটি ঠিক কাজ করেছিল। কোডটিতে কী সমস্যা এবং আমি কীভাবে এটি সংশোধন করতে পারি? ধন্যবাদ।


4
আপনার পোস্টটি 'একাধিক যুক্তি' সম্পর্কে জিজ্ঞাসা করছে, তবে আপনি কেবল একটি ব্যবহার করেন। এখন আমি কৌতূহল করছি যে কেউ এটি কীভাবে একাধিক যুক্তি দিয়ে এটি করতে পারে, এগুলি অ্যারে / ডিক্ট / যেকোনো কিছুতে মোড়ানো ব্যতীত।
রনলগ

উত্তর:


137

আপনার পদ্ধতির স্বাক্ষরটি হ'ল:

- (void) myTest:(NSString *)

withString প্যারামিটার হিসাবে ঘটে (নামটি বিভ্রান্তিকর, দেখে মনে হচ্ছে এটি নির্বাচকের স্বাক্ষরের অংশ)।

আপনি যদি এই পদ্ধতিতে ফাংশনটি কল করেন:

[self performSelector:@selector(myTest:) withObject:myString];

এটা কাজ করবে।

তবে, অন্যান্য পোস্টারগুলির পরামর্শ অনুসারে, আপনি পদ্ধতিটির নাম পরিবর্তন করতে পারেন:

- (void)myTestWithAString:(NSString*)aString;

এবং কল করুন:

[self performSelector:@selector(myTestWithAString:) withObject:myString];

2
এখন আমি দেখতে পেয়েছি যে এই উত্তরটি লোকেরা উপকৃত হয়েছে, আমি আমার প্রতিক্রিয়া পর্যালোচনা করেছি; আমি পরামর্শ দেব যে কলটি সহজভাবে হয়: - (শূন্য) টেস্টউইথস্ট্রিং: (এনএসএসআরটিং *) স্ট্রিং;
লিন্ডে ফার্গুসন

313

অবজেক্টিভ-সি-তে, কোনও নির্বাচকের স্বাক্ষর নিয়ে গঠিত:

  1. পদ্ধতির নাম (এই ক্ষেত্রে এটি 'মাই টেস্ট' হবে) (প্রয়োজনীয়)
  2. A ':' (কোলন) পদ্ধতির নাম অনুসরণ করে যদি পদ্ধতিতে কোনও ইনপুট থাকে।
  3. প্রতিটি অতিরিক্ত ইনপুট জন্য একটি নাম এবং ':'।

নির্বাচকদের সম্পর্কে কোনও জ্ঞান নেই:

  1. ইনপুট ধরণের
  2. পদ্ধতির রিটার্নের ধরণ।

এখানে একটি শ্রেণীর বাস্তবায়ন রয়েছে যেখানে পারফর্মমেথডভিয়া নির্বাচনকারী পদ্ধতি নির্বাচকদের মাধ্যমে অন্যান্য শ্রেণি পদ্ধতিগুলি সম্পাদন করে:

@implementation ClassForSelectors
- (void) fooNoInputs {
    NSLog(@"Does nothing");
}
- (void) fooOneIput:(NSString*) first {
    NSLog(@"Logs %@", first);
}
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
    NSLog(@"Logs %@ then %@", first, second);
}
- (void) performMethodsViaSelectors {
    [self performSelector:@selector(fooNoInputs)];
    [self performSelector:@selector(fooOneInput:) withObject:@"first"];
    [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];
}
@end

আপনি যে পদ্ধতিতে নির্বাচক তৈরি করতে চান তার একটি একক ইনপুট রয়েছে, তাই আপনি এর জন্য একটি নির্বাচক তৈরি করতে চান:

SEL myTestSelector = @selector(myTest:);

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

এর জন্য ধন্যবাদ. ive কিছুক্ষণ ধরে এটির সাথে লড়াই করে যাচ্ছিল, সহায়তার জন্য খুশি!
জেমস হল

কিভাবে ইনপুট পরামিতি পূর্ণসংখ্যা হয়? এক্ষেত্রে কী করতে হবে?
হোয়াং ফাম

1
আপনাকে একটি এনএসএনম্বার অবজেক্টে পূর্ণসংখ্যার মোড়ক লাগাতে হবে (দেখুন ডেভেলপার.অ্যাপল. com/ লাইব্রেরি / আইস /# ডকুমেন্টেশন / কোকো / রেফারেন্স / )) এবং তথাকথিত পদ্ধতির শিরোনামে পূর্ণসংখ্যা মান পুনরুদ্ধার করতে পারেন। এটি কিছুটা ভার্বোজ হতে পারে (এবং আমি এর আশেপাশের আরও ভাল উপায় খুঁজে পাইনি) তবে এটি দুর্দান্ত কাজ করে।
শেন আরনে

30
+100: এটি দুর্দান্ত! আমি একাধিক "উইট অবজেক্ট:" পরামিতি ব্যবহার করতে সক্ষম হওয়া সম্পর্কে জানতাম না। আমি যদি এটি করতে পারি তবে আমি একশ বার এটি
উত্সাহিত

13

@ শানে আরনে

performSelector:withObject:withObject:

আপনি আরও উল্লেখ করতে চাইতে পারেন যে এই পদ্ধতিটি কেবলমাত্র সর্বোচ্চ 2 টি আর্গুমেন্ট পাস করার জন্য, এবং এটি বিলম্বিত হতে পারে না। (যেমনperformSelector:withObject:afterDelay:)

কিন্ডা অদ্ভুত যে আপেল কেবল 2 টি বস্তু প্রেরণের জন্য সমর্থন করে এবং এটি আরও জেনেরিক করে নি।


2
তথ্যের জন্য ধন্যবাদ। আমি কাজ করতে দেরি করতে পারিনি এবং এখন আমি জানি কেন এটি। এফওয়াইআই, দুটি বস্তুর সীমাটি পেতে, আমি একটি অ্যারে পাস করেছি এবং তারপরে এটি পদ্ধতিতে ব্যবহার করেছি।
জেএসকারি

7

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

-(void)myTestWithString:(NSString *)sourceString comparedTo:(NSString *)testString ;

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

সংগ্রহটি গ্রহণের জন্য আপনি নিজের পদ্ধতির সর্বদা নতুন সংজ্ঞা দিতে পারেন কারণ এটি কেবলমাত্র পরামিতি:

-(void)myTestWithObjects:(NSDictionary *)testObjects ;

তবে আরও একটি মার্জিত সমাধান রয়েছে (এর জন্য রিফ্যাক্টরিংয়ের প্রয়োজন হয় না)। উত্তরটি হ'ল এনএসআইভোকেশন setArgument:atIndex:এবং এর invokeপদ্ধতিগুলি ব্যবহার করা।

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

শুভকামনা!


3

আপনার পদ্ধতির স্বাক্ষর কোনও অর্থহীন নয়, আপনি কি নিশ্চিত যে এটি টাইপো নয়? আমি কীভাবে এটি সংকলন করছি তা পরিষ্কার নয়, যদিও আপনি সম্ভবত সতর্কতা পেয়ে যাচ্ছেন যা আপনি উপেক্ষা করছেন?

আপনি এই পদ্ধতিটি গ্রহণের জন্য কতগুলি পরামিতি আশা করেন?


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

2

ক্লাসটি এই হিসাবে সংজ্ঞায়িত করা উচিত বলে মনে করুন:

- (void) myTestWithSomeString:(NSString *) astring{
    NSLog(@"hi, %s", astring);
}

আপনার কেবলমাত্র একটি একক প্যারামিটার রয়েছে যাতে আপনার কেবলমাত্র একক থাকতে হবে:

আপনি আপনার এনএসএলগে% @ ব্যবহার করার বিষয়টি বিবেচনা করতে চাইতে পারেন - এটি প্রবেশ করা কেবল একটি ভাল অভ্যাস - তারপরে কোনও স্ট্রিং নয় - কেবল কোনও স্ট্রিং নয় write


-1

আইওএস ব্যবহারকারীরাও অটোক্যাপিটালাইজেশন আশা করে: একটি মানক পাঠ্য ক্ষেত্রে, কেস-সংবেদনশীল ভাষায় বাক্যটির প্রথম অক্ষরটি স্বয়ংক্রিয়ভাবে মূলধন হয়ে যায়।

এই জাতীয় বৈশিষ্ট্যগুলি প্রয়োগ করতে হবে কি না আপনি সিদ্ধান্ত নিতে পারেন; সবে তালিকাভুক্ত বৈশিষ্ট্যগুলির জন্য কোনও উত্সর্গীকৃত এপিআই নেই, সুতরাং তাদের সরবরাহ করা একটি প্রতিযোগিতামূলক সুবিধা।

অ্যাপল ডকুমেন্ট বলছে যে কোনও কাস্টমবোর্ডে এই বৈশিষ্ট্যটির জন্য কোনও এপিআই এবং কিছু প্রত্যাশিত বৈশিষ্ট্য নেই। সুতরাং এটি বাস্তবায়নের জন্য আপনার নিজের যুক্তি খুঁজে বের করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.