سؤال

أحاول استدعاء الكاكاو IBAction من رمز الكربون ...

لقد قمت بإعداد مفاتيح عالمية باستخدام هذا البرنامج التعليمي.

تعمل المفاتيح الساخنة بشكل جيد ، لكنني بحاجة إلى إطلاق Ibacte عندما يتم الضغط على المفتاح العالمي.

ما زلت أحصل على أخطاء عند استخدامها

[self functionName]

كيف أسمي الوظيفة؟

لقد قرأت عن تمرير وحدة تحكم الكاكاو إلى طريقة الكربون. كيف يمكنني ان افعل هذا؟ أو ما هي أفضل طريقة؟

هل كانت مفيدة؟

المحلول

أفترض أنك تتصل [self functionName] في رد اتصال الحدث الكربون. هذه ليست طريقة موضوعية ، لذلك بالطبع self غير محدد.

عند تثبيت معالج أحداث الكربون ، فإن أحد المعلمات هو مؤشر "بيانات المستخدم". يمكنك تمرير مؤشر كائن Objective-C في هذه المعلمة ، بحيث يحصل معالج الحدث الخاص بك على ذلك ، ويمكنك أن تقول شيئًا مثل [(MyController*) inUserData functionName]. بالطبع ، لجعل هذا العمل ، يجب أن يكون معالجك في ملف المصدر الهدف-C أو Objective-C ++.

نصائح أخرى

يمكنك تمرير واحدة من هذه البيانات كبيانات المستخدم الخاصة بك مع الحفاظ على سلامة البرنامج لترجمات C ++:

/* include the necessary C header, located in objc/ (objc/objc.h?) */

/* of course, definitions with objc messaging belong in your .mm file */

class t_ibaction_invocation {

/* you may want to retain d_target or d_optionalArgument, and release at destruction */
    enum { RetainArguments = 0 };
public:

/* IBAction takes the form: [target action:optionalArgument]; */

    t_ibaction_invocation(id target, SEL action, id optionalArgument) : d_target(target), d_action(action), d_optionalArgument(optionalArgument) {
        assert(this->d_target);
        if (RetainArguments) {
            [this->d_target retain];
            [this->d_optionalArgument retain];
        }
    }

    ~t_ibaction_invocation() {
        if (RetainArguments) {
            [this->d_target release], target = 0;
            [this->d_optionalArgument release], optionalArgument = 0;
        }
    }

    id performAction() {
        if (this->d_target && this->d_action) {
            return [this->d_target performSelector:this->d_action withObject:this->d_optionalArgument];
        }
        else {
            assert(d_target && d_action);
            return 0;
        }
    }

private:
    id d_target;
    SEL d_action;
    id d_optionalArgument;
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top