سؤال

#import <UIKit/UIAlertView.h>

@class NSObject;

@interface SBIconController : NSObject
+ (SBIconController *)sharedInstance;
- (BOOL)isEditing;
@end

%hook SBIconController
-(void)iconTapped:(id)tapped {
    SBIconController *sbic = [objc_getClass("SBIconController") sharedInstance];
    if ([sbic isEditing]) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message"  message:[NSString stringWithFormat:@"%@", tapped] delegate:nil cancelButtonTitle:@"OK"  otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }
    %orig;
}
%end

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

الأسئلة الأخرى التي لدي هي:

  • لماذا نعلن الطبقة مثل SBIconController عندما يكون هناك بالفعل SBIconController صف دراسي?
  • لماذا نعلن أنها فئة فرعية من NSObject?
  • لماذا لا نكتب فقط في سبيكونكونترولر عندما ندعو [SBIconController sharedInstance] بدلا من [objc_getClass("SBIconController") sharedInstance]?

شكرا جزيلا لمساعدتكم!

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

المحلول

رمز على ما يرام.لقد اختبرته (لا أستخدم الشعارات) و iconTapped: ويسمى الأسلوب في الواقع عند النقر على أيقونة التطبيق.ولكن ما الذي تحاول تحقيقه مع isEditing?تشير هذه الخاصية إلى ما إذا كنت تقوم بتحرير نقطة انطلاق (انقر مع الاستمرار على أيقونة التطبيق) ومتى تساوي YES الطريقة iconTapped: لا يتم استدعاؤه عند النقر على الرمز.يطلق عليه فقط عندما isEditing يساوي NO.لذلك أقترح عليك إدراج تنبيه دون if ([sbic isEditing]) لاختبار ما إذا كان القرص الخاص بك يعمل.

أما بالنسبة لأسئلتك الأخرى:

  1. عند التعامل مع واجهات برمجة التطبيقات الخاصة ، ليس لدينا رؤوس وسنحصل على تحذيرات/أخطاء إذا حاولنا استخدامها.في حالتك انها SBIconController.لحل هذه المشكلة ، يمكننا إما تنزيل الرؤوس التي ألقاها الآخرون باستخدام أدوات مختلفة مثل تفريغ الفصل أو الإعلان عن واجهات برمجة التطبيقات الخاصة هذه بنفسك.في حالتك هو الأخير.
  2. لأن SBIconController يرث من NSObject.
  3. يمكنك أن تفعل ذلك في كلتا الحالتين.بالطبع ، عندما يكون لديك إعلان فئة لا تحتاج إلى استخدام objc_getClass.وفي حالتك لا تحتاج حتى إلى أي من هذه الأشياء.يمكنك فقط استخدام self كما تفعل في أي طريقة أخرى أوبج-ج.سوف التعليمات البرمجية تبدو مثل هذا:

    %hook SBIconController
    -(void)iconTapped:(id)tapped {
        if ([self isEditing]) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message"  message:[NSString stringWithFormat:@"%@", tapped] delegate:nil cancelButtonTitle:@"OK"  otherButtonTitles:nil];
            [alertView show];
            [alertView release];
        }
        %orig;
    }
    %end
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top