سؤال

لدي uitableview مع الخلايا المخصصة. داخل كل خلية هو 2 وجهات النظر. يحتوي كل عرض على uigesturereCognizer المرفقة للتعامل مع أحداث الننقر. عند استغلال العرض ، أرسل رسالة إلى uinavigationController لضغط طريقة عرض تفصيلية. يعمل هذا السيناريو بشكل جيد حتى أقوم بالفعل بالتمرير على الطاولة. بعد تمرير الجدول ، يتعطل التطبيق عندما ينقر المستخدم على إحدى طرق العرض داخل الخلية. على سبيل المثال ، يمكنني تحميل التطبيق ، والنقر فوق عرض في الخلية الثانية ، واحصل على عرض التفاصيل ليتم دفعه على الشاشة بشكل صحيح. من هناك ، أتنقل إلى الطاولة ، وانتقل إلى أسفل ، وأعود إلى الأعلى ، وانقر على نفس العرض. من هناك ، يتعطل التطبيق مع خطأ محدد غير معترف به. إليكم الإعداد الخاص بي للإيماءة (في ViewDidload):

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                          action:@selector(handleTap:)];
[self.view addGestureRecognizer:recognizer];
recognizer.delegate = self;
[recognizer release];

وهنا الطريقة التي يتم استدعاؤها:

-(void)handleTap:(UITapGestureRecognizer *)sender{
    NSLog(@"Handling tap on ArticleTileViewController");
    ArticleViewController *vc = [[ArticleViewController alloc] initWithArticleData:self.articleDataArray];
    PROJECTAppDelegate *appDelegate = (PROJECTAppDelegate *)[UIApplication sharedApplication].delegate;

    [appDelegate.navController pushViewController:vc animated:YES]; 
}[appDelegate.navController pushViewController:vc animated:YES]; 
    }

أخيرًا ، إليك تتبع المكدس الذي أحصل عليه في وحدة التحكم:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType handleTap]: unrecognized selector sent to instance 0x607ba30'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02839b99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0298940e objc_exception_throw + 47
    2   CoreFoundation                      0x0283b6ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x027ab2b6 ___forwarding___ + 966
    4   CoreFoundation                      0x027aae72 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x0057f060 -[UIGestureRecognizer _updateGestureWithEvent:] + 727
    6   UIKit                               0x0057b8bf -[UIGestureRecognizer _delayedUpdateGesture] + 47
    7   UIKit                               0x00580152 _UIGestureRecognizerUpdateObserver + 637
    8   UIKit                               0x00581464 _UIGestureRecognizerUpdateGesturesFromSendEvent + 51
    9   UIKit                               0x0032a844 -[UIWindow _sendGesturesForEvent:] + 1292
    10  UIKit                               0x003263bf -[UIWindow sendEvent:] + 105
    11  UIKit                               0x00309cb4 -[UIApplication sendEvent:] + 447
    12  UIKit                               0x0030e9bf _UIApplicationHandleEvent + 7672
    13  GraphicsServices                    0x02f07822 PurpleEventCallback + 1550
    14  CoreFoundation                      0x0281aff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    15  CoreFoundation                      0x0277b807 __CFRunLoopDoSource1 + 215
    16  CoreFoundation                      0x02778a93 __CFRunLoopRun + 979
    17  CoreFoundation                      0x02778350 CFRunLoopRunSpecific + 208
    18  CoreFoundation                      0x02778271 CFRunLoopRunInMode + 97
    19  GraphicsServices                    0x02f0600c GSEventRunModal + 217
    20  GraphicsServices                    0x02f060d1 GSEventRun + 115
    21  UIKit                               0x00312af2 UIApplicationMain + 1160
    22  PROJECT                                0x00002459 main + 121
    23  PROJECT                                0x000023d5 start + 53
    24  ???                                 0x00000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException

'

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

إليكم إعلان الرأس (إيفار والخصائص المحذوفة من أجل الوضوح:

@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> {

}

-(void)handleTap:(UITapGestureRecognizer *)sender;
هل كانت مفيدة؟

المحلول

تعني هذه المشكلات في الأساس أنك ترسل رسالة إلى كائن لا يتعرف على الرسالة على الإطلاق ، أي أن الطريقة مفقودة.

إن إنشاء محددك غير صحيح ، يجب أن يكون:

UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

و

- (void) handleTap:(UITapGestureRecognizer *)sender {

--تحديث--

recognizer.delegate = self;

أعتذر عن السؤال ، لكن هل أنت متأكد من أن "الذات" لديها بالفعل الطريقة handleTap:?

نصائح أخرى

اكتشفت ما كنت أفعله خطأ. في رمز التهيئة الخاص بي (من ViewController آخر) ، كنت أصدر ArticletileViewControllers بعد إضافتها إلى UitableViewCell. كان هذا يتسبب في رسول كائن لم يعد في الذاكرة.

خطأ مبرمج غبي !!

لا تحتاج إلى ضبط المندوب على الذات إذا كنت لا ترغب في تنفيذ أساليب المندوب.

    UITapGestureRecognizer *touchGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTouchedTheView:)];
    [touchGesture setCancelsTouchesInView:NO];
    [self.tableView addGestureRecognizer:touchGesture];

ستعمل أيضًا إذا قمت بتنفيذ UserTouchedTheView فقط: الطريقة.

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