سؤال

قمت بإنشاء زر وأضفت إجراءً لذلك ، ولكن بمجرد استدعاء ، حصلت على هذا الخطأ:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

هذا هو الكود الخاص بي:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}
هل كانت مفيدة؟

المحلول

يبدو أنك لا تقوم بإدارة وحدة التحكم في العرض بشكل صحيح ويتم تعويضها في مرحلة ما - مما يسبب numberButtonClicked: طريقة يتم إرسالها إلى كائن آخر يشغل الآن الذاكرة التي كانت وحدة التحكم في العرض تحتل سابقًا ...

تأكد من أنك تحتفظ بالاحتفاظ/إطلاق وحدة تحكم العرض الخاصة بك بشكل صحيح.

نصائح أخرى

بالنسبة لأولئك الذين يصلون إلى هنا عبر Google مثلما فعلت ، والذي ربما يتعلق أكثر بـ Xcode 4.2+/iOS 5+ ، ماذا مع ARC. واجهت نفس الخطأ "تم إرسال المحدد غير المعترف به إلى الأمثلة"في حالتي ، كان لديّ إجراء مستهدف لـ Uibultton تم إعداده لتمرير نفسه كمعلمة مرسل ، لكنني أدركت لاحقًا أنني لم أكن بحاجة إليه وأزالته في الكود. لذا ، شيء مثل: شيء ما: شيء ما.

- (IBAction)buttonPressed:(UIButton *)sender {

تم تغييره إلى:

- (IBAction)buttonPressed {

أظهر النقر بزر الماوس الأيمن أن Uibultton المعني أظهر أن اللمس داخل الحدث ارتبط مع Controllers View Controllers Method: Method. إزالة هذا وإعادة تعيينه إلى الطريقة المعدلة عملت علاج.

كان هذا هو أفضل إجابة Google لهذه المشكلة ، لكن كان لدي سبب/نتيجة مختلفة - اعتقدت أنني سأضيف في سنتتي في حالة تعثر الآخرين عبر هذه المشكلة.

لقد واجهت مشكلة مماثلة هذا الصباح فقط. لقد وجدت أنه إذا قمت بالنقر بزر الماوس الأيمن على عنصر واجهة المستخدم مما يمنحك المشكلة ، فيمكنك معرفة ما تم إنشاؤه. في حالتي ، كان لدي زر سلكي ما يصل إلى إجراءين. لقد قمت بحذف الإجراءات من قائمة النقر بزر الماوس الأيمن وتوصيلها وأصلح مشكلتي.

لذا تأكد من أن الإجراءات سلكية بشكل صحيح.

حسنًا ، لا بد لي من رقاقة هنا. المرجع تم إنشاء الزر ديناميكيًا. لقد واجهت مشكلة مماثلة والإجابة (بعد ساعات من الصيد) بسيطة للغاية مما جعلني مريضًا.

عند استخدام:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

إذا وضعت القولون في نهاية السلسلة - فسيتمرير المرسل. إذا لم تقم بوضع القولون في نهاية السلسلة ، فلن يحصل المتلقي على خطأ إذا كان يتوقع واحدة. من السهل تفويت القولون إذا كنت تقوم بإنشاء اسم الحدث ديناميكيًا.

تبدو خيارات رمز المتلقي هكذا:

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

كالعادة ، فإن الإجابة الواضحة هي التي تفوتها دائمًا.

في حالتي ، لم تكن الوظيفة تتوقع وسيطة ولكن تم تكوين الزر لإرسال واحدة تسبب الخطأ. لإصلاح هذا ، اضطررت إلى إعادة توصيل معالج الحدث.

ها هي وظيفتي:

enter image description here

لاحظ أنه لا يحتوي على حجج.

فيما يلي صورة لتكوين الزر الخاص بي (انقر بزر الماوس الأيمن على الزر لعرضه):

enter image description here

لاحظ أن هناك 3 معالجات الأحداث.

لإصلاح هذا ، اضطررت إلى إزالة كل من عناصر الحدث لأن أحدهم كان يرسل إشارة إلى نفسه إلى وظيفة Endpressed. لإزالة هذه العناصر ، قمت بالنقر فوق أيقونة X X بجوار اسم كل عنصر حتى لا يتم عرض عناصر.

enter image description here

بعد ذلك اضطررت إلى إعادة توصيل الزر بالحدث. للقيام بذلك ، اضغط على مفتاح التحكم ثم اسحب خطًا من الزر إلى الإجراء. يجب أن تقول "توصيل العمل". ملاحظة: اضطررت إلى إعادة تشغيل Xcode لهذا العمل لسبب ما ؛ وإلا فإنه يسمح لي فقط بإدراج الإجراءات (ويعرف أيضًا باسم إنشاء إجراء جديد) أعلى أو أسفل الوظيفة.

enter image description here

يجب أن يكون لديك الآن معالج أحداث واحد سلكي في حدث الزر الذي لا يمرر أي وسيطات:

enter image description here

تكمل هذه الإجابة إجابة leonard challis التي يجب عليك قراءتها أيضًا.

يمكن أن يحدث هذا أيضًا إذا لم تقم بتعيين "فئة" العرض في Builder Interface.

في حالتي ، كنت أستخدم nsnotificationcenter وكنت أحاول استخدام محدد لا يأخذ أي حجج ، لكنني أضيف قولون. إزالة القولون إصلاح المشكلة.

عند استخدام اسم المحدد ، لا تستخدم القولون المتخلف إذا لم تكن هناك حجج. إذا كانت هناك حجة واحدة ، استخدم القولون الزائد. إذا كان هناك أكثر من حجة واحدة ، فيجب عليك تسميتها مع القولون الزائد لكل حجة.

انظر إجابة آدم روزنفيلد هنا: المحددون في الهدف-C؟

واجهت هذه المشكلة مع مشروع سريع حيث أقوم بإنشاء الأزرار ديناميكيًا. رمز المشكلة:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

كان الحل هو إضافة قولون كامل ":" بعد الإجراء: على سبيل المثال

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

مثال كامل هنا: https://developer.apple.com/library/content/samplecode/uicatalog/listings/swift_uikitcatalog_defaulttoolbarviewcontroller_swift.html

السبب الأكثر وضوحًا لهذا (المدرجة في الاكتمال) هو إلقاء مؤشر بشكل غير صحيح ويطلق على طريقة الفئة الخاطئة.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

واجهت مشكلة مماثلة ، لكن بالنسبة لي كان الحل مختلفًا قليلاً. في حالتي ، استخدمت فئة لتوسيع فئة موجودة (uiimage لبعض القدرات تغيير حجمها - انظر هذا كيف في حال كنت مهتمًا) ونسيت إضافة ملف *.M إلى هدف البناء. خطأ غبي ، ولكن ليس واضحا دائما عندما يحدث أين ننظر. اعتقدت أن الأمر يستحق المشاركة ...

كان لدي نفس الخطأ واكتشفت ما يلي:

عند استخدام الرمز

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

قد تعتقد أنه يبحث عن المحدد:

- (void)yourRefreshMethod{
    (your code here)
}

لكنها تبحث في الواقع عن المحدد:

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

هذا المحدد غير موجود ، لذلك تحصل على الحادث.

يمكنك تغيير المرسل المحدد لتلقي (ID) من أجل حل الخطأ.

ولكن ماذا لو كان لديك وظائف أخرى تستدعي وظيفة التحديث بدون توفير مرسل؟ تحتاج إلى وظيفة واحدة تعمل لكليهما. الحل السهل هو إضافة وظيفة أخرى:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

ثم قم بتعديل رمز الانسحاب من التحديث لاستدعاء هذا المحدد بدلاً من ذلك:

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

أقوم أيضًا بدورة Stanford iOS على جهاز Mac أقدم لا يمكن ترقيته إلى أحدث إصدار من Mac OSX. لذلك ما زلت بناء لنظام التشغيل iOS 6.1 ، وهذا حل المشكلة بالنسبة لي.

كان لدي أيضا نفس المشكلة.

لقد حذفت Uibutton في لوحة المصورة وأعادتها .. الآن كل شيء يعمل بشكل جيد.

لقد حدث هذا لي لأن محوًا عن طريق الخطأ "Func func ..." داخل رمز فئة UiviewController الخاص بي ، لذلك تم إنشاء منفذ مرجعي في لوحة القصة ، ولكن في وقت التشغيل ، كانت هناك أي وظيفة لمعالجتها.

كان الحل هو حذف مرجع المخرج داخل مفتش العقار ثم إعادة إنشاءه مع مفتاح الأمر إلى رمز الفصل.

أتمنى أن يساعد!

أعتقد أنه يجب عليك استخدام الفراغ ، بدلاً من iBacte في نوع العودة. لأنك حددت زرًا برمجيًا.

حل آخر ممكن: أضف "-OBJC" إلى وسيطات الرابط الخاصة بك.

التفسير الكامل هنا: فئات الهدف-C في المكتبة الثابتة

أعتقد أن GIST هو: إذا تم تعريف الفئة في مكتبة ترتبط بها بشكل ثابت ، فإن الرابط ليس ذكيًا بما يكفي للربط في طرق الفئة. العلم أعلاه يجعل رابط الارتباط في جميع فئات وفئات C الموضوعية ، وليس فقط تلك يعتقد يجب أن يستند إلى تحليل مصدرك. (لا تتردد في ضبط هذه الإجابة أو تصحيحها. أنا أعرف اللغات المرتبطة ، لذلك أنا فقط أقوم بببغاء هنا).

أنا أتعلم حاليًا تطوير iOS وأمر "بداية تطوير iOS6" من قبل Apress. كنت أحصل على نفس الخطأ في الفصل 10: القصص المصورة.

استغرق الأمر مني يومين لمعرفة ذلك ، لكنني اكتشفت أنني قمت بتعيين علامة خلية TableView بطريق الخطأ على 1 عندما لا ينبغي أن يكون لدي. لأي شخص آخر يقوم بهذا الكتاب وتلقي خطأ مماثل ، آمل أن يساعد هذا.

آمل حقًا العثور على الأخطاء المستقبلية في الكود الخاص بي! ها ها ها ها. لم يفعل خطأ تصحيح الأخطاء أي شيء لدفعني في الاتجاه الصحيح إلى اكتشافه (أو على الأقل أنا جديد جدًا لفهم مصحح الأخطاء ، لول).

في حالتي ، كنت أستخدم UIWEBView وقد مررت NSString في المعلمة الثانية بدلاً من nsurl. لذلك أظن أن أنواع الفئات الخاطئة التي تنتقل إلى وظائف يمكن أن تسبب هذا الخطأ.

.. والآن لي

كان لدي زر مرتبط بالطريقة التي وصلت إلى معلمة زر أخرى والتي عملت بشكل رائع ولكن بمجرد أن حاولت القيام بشيء ما مع الزر نفسه ، تعطلت. أثناء التجميع ، لم يتم عرض أي خطأ .. حل؟

فشلت في ربط الزر بمالك الملف. لذلك إذا كان أي شخص هنا غبيًا مثلي ، فحاول هذا :)

حل آخر مختلف قليلا/حالة.

أنا أستخدم Xamarin و MVVMcross وكنت أحاول ربط Uibultton بعرض ViewModel. كان لديّ Uibutton سلكيًا إلى منفذ ومسك.

عند الربط ، أستخدم المخرج فقط:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

كل ما كان علي فعله هو إزالة اتصال الإجراء (Touchupinside) في Xcode والذي حله.

ملاحظة: أعتقد أن هذا في قاعدته مرتبط بالإجابات السابقة وإلى @chris kaminski على وجه الخصوص ، لكنني آمل أن يساعد هذا شخص ما ...

هتافات.

كان لي نفس القضية. كانت المشكلة بالنسبة لي أن الزر واحد كان له طريقتان عملان. ما فعلته هو إنشاء طريقة إجراء أولى للزري ثم حذفها في وحدة التحكم في العرض ، لكن نسيت فصل الاتصال في لوحة العمل الرئيسية في مفتش الاتصال. لذلك عندما أضفت طريقة إجراء ثانية ، كانت هناك الآن طريقتان للإجراء لزر واحد ، مما تسبب في الخطأ.

بالنسبة لي ، كان اتصال بقايا تم إنشاؤه في interfacebuilder bij ctrl-drainging. كان اسم الاتصال المكسور في سجول الأخطاء

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

كان لدي إجراء مرتبط بزر. تحطمت الضغط على الزر التطبيق لأن المنفذ لم يعد موجودًا في الكود الخاص بي. قادني البحث عن الاسم الموجود في السجل في لوحة العمل. حذفها ، وذهب الحادث!

في حالتي ، حللت المشكلة بعد ساعتين:

المرسل (عنصر تاببار) لم يكن لديك أي منفذ مرجع. لذلك كان لا يشير إلى أي مكان.

جوستي إنشاء منفذ مرجع يتوافق مع وظيفتك.

أتمنى أن يساعدك هذا يا رفاق.

أرد على ليونارد تشاليس ، لأنني كنت أيضًا أتناول فئة ستانفورد IOS C193P ، كما كان مستخدم "OLI206"

"إنهاء التطبيق بسبب استثناء غير معطل" nsinvalidargumentexception "، السبب:"

كانت المشكلة هي أنه كان لدي زر "إدخال" على الآلة الحاسبة المتصلة مرتين ، وأشار صديق إلى أن إجراء فحص للزر في لوحة القصة أظهر أن اثنين زر "إدخال". محو أحدهما "اللمسات الداخلية داخل" الأحداث المرسلة "حل المشكلة.

أظهر هذا أن المشكلة يتم تشغيلها (لفئة الفيديو C193P على تجول الآلة الحاسبة في المهمة 1) كحدثين أرسلوا ، أحدهما يسبب الاستثناء.

يمكن أن يحدث ذلك عندما لا تقوم بتعيين ViewController لـ ViewControllerScene في InterfaceBuilder. لذلك فإن ViewController.m غير متصل بأي مشهد.

بما في ذلك حصتي. لقد تعثرت على هذا لفترة من الوقت ، حتى أدركت أنني قمت بإنشاء مشروع مع قوس (مرجع العد التلقائي) معاق. مجموعة سريعة على نعم على هذا الخيار حل مشكلتي.

سبب سخيف آخر لهذا هو وجود محدد محدد في الواجهة (.H) ولكن ليس في التنفيذ (.M) (خطأ مطبعي)

سبب/حل آخر للإضافة إلى القائمة. هذا هو سبب iOS6.0 (و/أو البرمجة السيئة). في الإصدارات القديمة ، سيتطابق المحدد إذا كانت أنواع المعلمات متطابقة ، لكن في iOS 6.0 حصلت على حوادث في رمز العمل سابقًا حيث لم يكن اسم المعلمة صحيحًا.

كنت أفعل شيئًا مثل

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

ولكن في التعريف (كلاهما .H و .m) كان لدي

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

لقد عمل هذا بشكل جيد على iOS5 ولكن ليس على 6 ، حتى البنية نفسها التي تم نشرها على أجهزة مختلفة.

لا أفهم لماذا لم يخبرني المترجم Coud هذا ، على أي حال - مشكلة.

قد يحدث هذا أيضًا عندما ترغب في تعيين خاصية من وحدة تحكم إلى خاصية عامة داخل فئة ControlerB مخصصة ولم تقم بتعيين "الفئة المخصصة" داخل مفتش الهوية في القصص المصورة حتى الآن.

كانت مشكلتي وحلتي مختلفة واعتقدت أنه يجب علي نشرها هنا حتى يتمكن القراء في المستقبل من إنقاذ رؤوسهم من الضرب إلى الحائط.

كنت أقوم بتخصيص XIB مختلف لنفس UiviewController وحتى بعد البحث في كل مكان لم أتمكن من العثور على كيفية تصحيحه. ثم راجعت AppDelegate حيث كنت أتصل initWithNibName ويمكنني أن أرى ذلك أثناء نسخ الكود ، قمت بتغيير اسم XIB ، لكن نسيت التغيير UIViewController صف دراسي. لذلك إذا لم ينجح أي من الحل من أجلك ، تحقق من initWithNibName طريقة.

حدث لي بسبب حجج القيود المتضاربة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top