بسيط فون الهروب من السجن قرص لا يعمل
سؤال
#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])
لاختبار ما إذا كان القرص الخاص بك يعمل.
أما بالنسبة لأسئلتك الأخرى:
- عند التعامل مع واجهات برمجة التطبيقات الخاصة ، ليس لدينا رؤوس وسنحصل على تحذيرات/أخطاء إذا حاولنا استخدامها.في حالتك انها
SBIconController
.لحل هذه المشكلة ، يمكننا إما تنزيل الرؤوس التي ألقاها الآخرون باستخدام أدوات مختلفة مثل تفريغ الفصل أو الإعلان عن واجهات برمجة التطبيقات الخاصة هذه بنفسك.في حالتك هو الأخير. - لأن
SBIconController
يرث منNSObject
. يمكنك أن تفعل ذلك في كلتا الحالتين.بالطبع ، عندما يكون لديك إعلان فئة لا تحتاج إلى استخدام
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