iPhone - UINavigationController، هل تريد إعادة استخدام طرق العرض؟

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

سؤال

سؤال الجذر هو "كم عدد uiviewControllers الذي يمكنك دفعه على مكدس التنقل؟" دون التسبب في تحذيرات الذاكرة أو كسب إنهاء هيئة الرقابة.

لنفترض أن لدي تطبيقًا يمثل في الأساس قاعدة بيانات لثلاثة كيانات حيث يمكن لكل منها أن يكون له علاقة مع كيان آخر، وتظهر العلاقة على UIViewController.يمكن للمستخدمين متابعة هذه العلاقات ويقوم كل واحد منهم بإحضار وحدة تحكم جديدة - إذا كانت الكيانات هي A وB وC وA->B->C->B->C->A، فإن كل نوع من طرق العرض يكون على المكدس مرتين .أنا أفهم كيفية الدفع والانبثاق، وكيفية الدفع مرة أخرى إلى وحدة تحكم معينة، وأعتقد أنه بدلاً من مجرد تمديد حزمة التنقل إلى أجل غير مسمى، قد يكون من الأفضل إعادة استخدام وحدة تحكم العرض في حزمة التنقل.

للقيام بذلك، في كل مرة أردت فيها الحصول على FirstEntityViewController، كان بإمكاني فحص حزمة التنقل للعثور على كائن حيث [self isKindOfClass:[FirstEntityViewController class]]; ثم اتصل بالطرق المصممة لإعادة تنظيم هذا العرض لما أريد رؤيته حاليًا - فقط قم بتحديث البيانات بنفس الطريقة التي تفعلها عند إعادة استخدام UITableViewCell.

هذا جيد باستثناء التأثير الذي قد يحدثه على NavigationController.إذا كنت تستخدم UINavigationController:popToViewController:animated: أعتقد أنه سيتم تجاهل كل شيء أعلى العرض الذي أنتقل إليه، بما في ذلك العرض الذي يتوقع المستخدم العثور عليه عند النقر على "رجوع" في شريط التنقل.لذلك ينقر المستخدم على العلاقة، ثم ينقر مرة أخرى ويقول "هاه؟"

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

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

أم أن الأمر أصبح معقدًا للغاية؟ألا داعي للقلق بشأن هذا الموقف لأن نظام التشغيل يعيد استخدام الكثير من وحدات التحكم في العرض بنفس الطريقة التي يتم بها إعادة استخدام UITableViewCells، ولا يوجد أي تأثير حقيقي على الذاكرة أو الأداء في الحصول على مكدس تنقل بعمق 50؟

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

المحلول

تظل مثيلات ViewController في مكدس UINavigationController، ولكن قد يتم إلغاء تحميل أي عرض باستثناء العرض العلوي في أي وقت (يتم إخطار وحدة تحكم العرض عبر viewDidUnload رسالة).

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

نصائح أخرى

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

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

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