زر واجهة المستخدم "العادي" الذي يسبب استثناء obj_stack_overflow أو EXC_BAD_ACCESS

StackOverflow https://stackoverflow.com/questions/1421793

سؤال

من المؤكد أنها تبدو غير ضارة بما فيه الكفاية.في مندوب التطبيق الخاص بي، أتحقق NSUserDefaults للحصول على علامة لإظهار النصائح عند بدء التشغيل.إذا تم تعيينه بعد ذلك، في نهاية applicationDidFinishLaunching:, ، أفعل هذا:

TipsViewController *vc = [[TipsViewController alloc]
  initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];

والفكرة هي لإظهار هذا الرأي مؤقتا.(لاحظ أنه ليس VC مشروطًا.لا توجد وحدة تحكم للتنقل في هذه المرحلة، بالإضافة إلى عدم وجود شريط تنقل في طريقة العرض هذه على أي حال.)

بمجرد رفض هذا الرأي، سنضيف استباقنا UITabBarControllerعرض إلى النافذة والانتقال إليها، ثم قم بإزالة عرض التلميح من النافذة الرئيسية.لم أصل إلى نقطة رفض العرض بعد، لأنه حسنًا، استمر في القراءة.

يتم توصيل VC الخاص بـ My TipsView بشكل أو بآخر على النحو التالي:

UIView -> view -> File’s Owner (TipsViewController)
  UIImageView -> background image
  UIView -> tipView -> File’s Owner
    UIImageView -> background image
    UIScrollView
      UILabel (tip text)
    UIButton -> touch-up-inside -> -(IBAction)button1:
    UIButton -> touch-up-inside -> -(IBAction)button2:
    UIButton -> touch-up-inside -> -(IBAction)button3:

ويحتوي المصدر على تصريحات وتعريفات لجميع الثلاثة IBAction المكالمات.الآن اثنان منهم لا يفعلون شيئًا.والثالث يغير الطرف text, ، وتغيير حجمه ليناسب، وضبط عرض التمرير contentSize كثيرا.

عندما أقوم بتشغيل التطبيق، TipsViewController يظهر العرض على ما يرام.يمكنني حتى التمرير عبر نص النصيحة.ومع ذلك، عندما أقوم بتشغيل لمسة داخلية على أي منها UIButton, ، يبدأ Xcode في زرعي في المصدر (حيث قمت بوضع نقطة توقف عند كل منها IBAction) ... ثم ينقذ إما بـ a EXC_BAD_ACCESS أو obj_stack_overflow.

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

If you use a single view controller in your application, you add its view to a window instead of adding the view controller to a tab bar or navigation controller.

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

ربما أفعل شيئًا خاطئًا بمهارة؟هل هناك طريقة أفضل؟("يجب أن تكون هناك طريقة أفضل!")

نموذج تتبع المكدس:

#0  0x992b6f52 in objc_exception_throw
#1  0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2  0x3026e056 in ___forwarding___
#3  0x3024a0a2 in __forwarding_prep_0___
#4  0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5  0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6  0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7  0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8  0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9  0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14

كما ترون من الأثر، انتهى بنا الأمر عند doesNotRecognizeSelector: … باستثناء أنني أستطيع رؤية الأساليب الموجودة في مصدر VC الخاص بي بوضوح.بالإضافة إلى ذلك، جميعها متصلة بالأسلاك.(لا توجد أسلاك متعددة أو أي شيء من هذا القبيل في IB.كل شيء يبدو جيدًا هناك، وصولاً إلى علاقات مالك الملف.)

القرائن موضع ترحيب / تقدير!

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

المحلول

تكمن المشكلة في مقتطف الشفرة الأول:أنت تقوم بإنشاء مثيل لـ TipsViewController، وتحتفظ بعرضه، ثم تحرر وحدة تحكم العرض - مما سيؤدي إلى إلغاء تخصيصه.حتى الآن target من الأزرار هو مؤشر إلى وحدة تحكم العرض غير المخصصة.

لا تحتفظ طريقة العرض بوحدة التحكم في طريقة العرض الخاصة بها، ولا تحتفظ بمفوضيها أو أهدافها.

سيتعين عليك الاحتفاظ بمثيل وحدة تحكم العرض - ربما في ملف retain الخاصية - طالما كنت تريد عرض العرض.عند الانتهاء من العرض، يمكنك إزالته من العرض الأصلي الخاص به، وتحرير وحدة التحكم في العرض.

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