سؤال

أحاول عرض مشروط إطلالة مباشرة بعد آخر عرض تم تقديمه modally (والثاني هو تحميل يرى أن يظهر).

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    LoadViewController *loader = [[LoadViewController alloc] init];
    [self presentModalViewController: loader animated:NO];
    [loader release];
}

ولكن عندما أفعل هذا أحصل على برنامج "إشارة وردت:"EXC_BAD_ACCESS"." خطأ.

تتبع المكدس هو:

0  0x30b43234 in -[UIWindowController transitionViewDidComplete:fromView:toView:]
1  0x3095828e in -[UITransitionView notifyDidCompleteTransition:]
2  0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3  0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:]
4  0x0051e331 in run_animation_callbacks
5  0x0051e109 in CA::timer_callback
6  0x302454a0 in CFRunLoopRunSpecific
7  0x30244628 in CFRunLoopRunInMode
8  0x32044c31 in GSEventRunModal
9  0x32044cf6 in GSEventRun
10 0x309021ee in UIApplicationMain
11 0x00002154 in main at main.m:14

أي أفكار ؟ أنا تماما الحيرة!تحميل عرض فارغة لذلك هناك بالتأكيد لا شيء يحدث هناك الذي يتسبب في حدوث الخطأ.هو أن تفعل شيئا مع إطلاق 2 الآراء modally في نفس الحدث حلقة أو شيء ما ؟

شكرا

مايك

تحرير:غريبة جدا...أنا عدلت عليه قليلا حتى تحميل عرض يظهر بعد صغيرة تأخير و هذا يعمل بشكل جيد!لذلك يبدو أن هناك شيء في نفس الحدث حلقة!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}
هل كانت مفيدة؟

المحلول

ولقد تعديله قليلا بحيث يظهر عرض التحميل بعد تأخير صغير، وهذا يعمل بشكل جيد! لذلك يبدو أن شيئا ما داخل نفس الحلقة الحدث!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}

نصائح أخرى

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

وبعد قراءة المشاركات في هذا الموضوع، حاولت خلق مثال استنساخه بسيط باستخدام القالب تبويب شريط التطبيق. وكنت قادرا على استخدام UIImagePickerController لإظهار أول عرض الوسائط بعد الاستجابة لانقر فوق زر في "FirstViewController.m". عندما حاولت أن تظهر UIImagePickerController مرة أخرى (بعد معالجة الرسالة imagePickerControllerDidCancel)، تحطمت التطبيق مع نفس الخطأ.

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

و *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from to while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

وهكذا يبدو أن خياري الوحيد هو اتباع نصيحة من رسالة الخطأ وببساطة الانتظار حتى viewDidAppear (باستخدام العلم للإشارة أنا في هذا الوضع خاص) ومن ثم تحميل عرض مشروط الثاني.

وهنا تتبع المكدس كاملة للتأكد من اكتمالها:

** Call stack at first throw:
(
 0   CoreFoundation                      0x0238c919 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x024da5de objc_exception_throw + 47
 2   CoreFoundation                      0x02345078 +[NSException raise:format:arguments:] + 136
 3   Foundation                          0x000ab8cf -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
 4   UIKit                               0x00544317 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 212
 5   UIKit                               0x0035c769 -[UIViewController presentModalViewController:withTransition:] + 2937
 6   TestTempDelete                      0x000021cf -[FirstViewController showImagePicker] + 167
 7   Foundation                          0x0002fcea __NSFireDelayedPerform + 441
 8   CoreFoundation                      0x0236dd43 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
 9   CoreFoundation                      0x0236f384 __CFRunLoopDoTimer + 1364
 10  CoreFoundation                      0x022cbd09 __CFRunLoopRun + 1817
 11  CoreFoundation                      0x022cb280 CFRunLoopRunSpecific + 208
 12  CoreFoundation                      0x022cb1a1 CFRunLoopRunInMode + 97
 13  GraphicsServices                    0x02bf12c8 GSEventRunModal + 217
 14  GraphicsServices                    0x02bf138d GSEventRun + 115
 15  UIKit                               0x002beb58 UIApplicationMain + 1160
 16  TestTempDelete                      0x00001eb4 main + 102
 17  TestTempDelete                      0x00001e45 start + 53

وآمل أن يساعد هذا.

و** مثل قيل في وقت سابق، واستخدام isIgnoringInteractionEvents

//Check if the app is ignoring interatctions, if so, add a delay for 1 sec
if([[UIApplication sharedApplication] isIgnoringInteractionEvents]==TRUE) {
        [currentViewController performSelector:@selector(presentModalViewController:animated:) withObject:screen afterDelay:1];
    } else {
        [currentViewController presentModalViewController:screen animated:YES];
    }

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

أنا واجهت نفس استثناء

إنهاء التطبيق بسبب غير مسك استثناء 'NSInternalInconsistencyException', السبب:'محاولة تبدأ مشروط الانتقال من مرحلة إلى حين الانتقال بالفعل في التقدم.انتظر viewDidAppear/viewDidDisappear أن تعرف الانتقالية الحالية أكملت'

كما اقترح في وقت سابق حاولت تأخير تقديم الوسائط الانتقال, ولكن هذا لم يساعد.ثم وجدت أن لدي متعددة IBActions مرتبطة زر TouchUpInside الحدث!!!.في حالتي اثنين IBActions أن تبدأ:عرض منتقي الأشخاص modally وتقديم صورة المنتقى modally.وهذا ما يفسر ظهور رسالة خطأ.تحقق إذا كان لديك عدة IBActions اتصال!

والمشكلة هي على الأرجح في الطريقة التي inits ويقدم الأسلوب الذي viewDidAppear في، أو في الحرف الأول أسلوب / viewDidLoad / viewWillAppear من LoadViewController.

وتعيين بعض نقاط لكسر الارسال وتابع حتى تحطم ...

وكان لي خطأ مشابهة عند النقر على UIButton لفتح Modal View. لقد غيرت المستمع UIButton's من UIControlEventAllEvents إلى UIControlEventTouchUpInside. في الأساس، كان اطلاق مشروط عرض على Touch Down Inside ثم مرة أخرى على Touch Up Inside.

وكان لي نفس المشكلة بسبب عدم تطابق بين أسماء في

HelpViewController *controller = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];

وواسم الملف .xib الفعلي.

وأعتقد أن هذه المسألة لها علاقة مع المشكلة التي واجهت أيضا. فمن السهل جدا لإعادة إنتاج:

إنشاء مشروع جديد كسكودي "تطبيق المساعدة". في FlipsideViewController.m كنت مجرد إدراج الأسلوب التالي:

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear: animated];
  [self showInfo];
}

إذا قمت بذلك، بدء التطبيق، ثم الرؤية الجانب الثاني سيتم تفعيل الحق بعيدا. بمجرد الضغط على زر "تم" على العرض الثاني، وسوف نعود إلى Mainview التي تطلق viewDidAppear مرة أخرى ويذهب الحق في العودة إلى flipside- رأي. حالما يتم عرض العرض الثاني، وتوقف التطبيق - لا توجد ذاكرة ودعا deallocators - انها مجرد مثل لديك ضغط المنزل على زر

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

وأنا حقا لدي أي فكرة، ما هي هذه المشكلة حقا ...

مع أطيب التحيات، توبياس

وانها حقا يتوقف على ما إجراءات الدعم لviewDidAppear يفعلون. على سبيل المثال، إذا presentModalViewController:animated: لا تحتفظ loader قد يكون راجعا إلى UIWindowController يحاول أن يتكلم عن loader الذي أطلق سراح (في نهاية روتين قمت بنشرها) الحادث.

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(needDisplayLoader)
        [self presentModalViewController: loader animated:NO];
}

وبعد ذلك أنا وضعت needDisplayLoader إلى NO قبل اقالة عرض محمل

ويساعد هذا الأمل ...

وجريت إلى هذه المسألة الآن فقط، وتصحيحه باستخدام محدد: afterDelay اقتراح أعلاه. مجرد إضافة، أنا جمعت (بدون الإصلاح) تحت نظام التشغيل اي فون 4.0 بيتا، وNO CRASH! لذلك، يظهر خطأ في كسكودي لتم إصلاحها في جنرال المقبل. لا أن هذا لا أحد منا أي جيدة اليوم، ولكن فقط حتى تعلمون جميعا، فإنه حقا <م> كان خطأ في كسكودي وليس بالضرورة أي شيء كنا نفعل الخطأ في أساليب الترميز لدينا.

وكان نفس المشكلة بالضبط. حلها مع ما سبق واقترح ...

و [self performSelector:@selector(doit) withObject:nil afterDelay:0.5];

وكان لاستخدام تأخير 0.5 ثانية. ربما لأنني كنت أداء presentModalViewController مباشرة بعد مشروط UIPickerViewController.

وكان لي فقط هذه المشكلة واتضح أن مشكلتي كانت لأنني كنت dealloc بلدي بروتوكول مندوب.

وأعتقد أن السبب في الحلقة هو أن تحكم النظرة الجديدة التي تقوم بتحميل لديه طريقة viewDidAppear افتراضيا ولها

[super viewDidAppear animated];

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

وفي Viewcontroller التي يتم تقديم لديك أسلوب مثل هذا، دون فائقة viewdidapper:

-(void)viewDidAppear:(BOOL)animated{
    //[super viewDidAppear:animated]; no super

}

وEXC_BAD_ACCESS هو خطأ الذاكرة. ربما كنت تحاول استخدام كائن الذي سبق أن صدر / يتم deallocated. هذه الإجابة يعطي بعض النصائح لتصحيح هذه القضايا:

تصحيح

EXC_BAD_ACCESS

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