سؤال

لدي UIViewController - دعنا نسميه "FormController" - وهو مجرد نموذج يقوم بتحرير كائن.أريد استخدامه في حالتين مختلفتين:

  1. إنشاء كائن جديد — باستخدام UINavigationController's presentModalViewController: طريقة.

  2. تحرير كائن موجود — ادفع وحدة التحكم في العرض إلى حزمة UINavigationController، وليس باستخدام أسلوب الحوار.

هناك اختلاف طفيف في أنه في الحالة المشروطة، أرغب في الحصول على شريط أدوات به زري "إلغاء" و"تم"، بينما في حالة المكدس أود فقط الحصول على شريط التنقل المقدم من UINavigationController.

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

سؤالي هو:ما هي أفضل طريقة للتعامل مع كلتا الحالتين دون الحاجة إلى كتابة وحدتي تحكم منفصلتين ولكن متطابقتين في الغالب؟

فكرت في إنشاء "ModalFormController" الذي يغلف "FormController" العاري من خلال التكوين ويضيف شريط أدوات، لكنني قرأت في مكان ما في المستندات أن Apple لا توصي بتداخل وحدات التحكم في العرض.

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

المحلول

ما أفعله (أحيانًا) هو إعداد ملف enum الذي يحدد نوع وحدة تحكم العرض.

على سبيل المثال، قد يكون لديك نوعين:ان Edit النوع، و Add ("نوع جديد.

ال Add يتم تنفيذ النوع عبر وحدة تحكم العرض المشروط، بينما يتم تنفيذ Edit يتم دفع النوع إلى مكدس التنقل الموجود.

في وحدة تحكم العرض -viewDidLoad: الطريقة، أنا ببساطة أفعل switch/case الشجرة التي تقوم بإعداد العنوان وخصائص المظهر الأخرى اعتمادًا على تعداد النوع المحدد أعلاه.

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

لكن ال switch/case الشجرة تجعل إدارتها أسهل بكثير.

لذا، يعتمد الأمر على ما تحاول فعله بالنوعين.لكنها بالتأكيد قابلة للتنفيذ.

نصائح أخرى

لماذا لا تستخدم الفئات الفرعية؟يصنع ModalCreateFormController فئة فرعية من EditFormController والتعامل مع الأشياء الخاصة بالوسائط في الفئة الفرعية.

بالإضافة إلى وجود خاصية واضحة في وحدة التحكم في العرض (كما يقترح Alex Reynolds)، هناك طريقتان أخريان خطرت ببالي:

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

  2. انظر إلى قيمة وحدة التحكم parentViewController ملكية.إذا كان على سبيل المثال UINavigationController, ، فأنت في حزمة التنقل.إذا تم عرضك بشكل مشروط، فسيكون ذلك بمثابة مثيل لوحدة التحكم في قائمتك.

آه، أنا أكره ivars اضافية…

أستخدم هذا بدلاً من ذلك:

if([[self.navigationController viewControllers] objectAtIndex:0] == self){

        //Modal

    }else{

        //Pushed

    }

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

اضطررت إلى القيام بذلك عدة مرات في تطبيقي وبعد تجربة طريقتين مختلفتين للقيام بذلك، بما في ذلك الفئات الفرعية المشروطة والفئات المساعدة المشروطة القابلة لإعادة الاستخدام والتي تستخدم ForwardInvocation.لقد وجدت أن أفضل نمط هو إنشاء طريقة تحتوي على ModalViewController لكل وحدات تحكم عرض تقوم (عادةً) بإنشاء وإرجاع UINavigationController ليستخدمه المتصل مع PresentModalViewController.

في معظم الحالات، تقوم هذه الطريقة ببناء وإرجاع UINavigationController مع وحدة تحكم العرض الذاتية (مع استدعاءات متكررة للطريقة للتحقق من self.navigationController وإرجاع ذلك بدلاً من ذلك إذا لم يكن صفرًا).في حالات أخرى، قمت بإنشاء وحدة تحكم جذرية وهمية أولاً ثم دفعت ذاتيًا في الثانية من أجل الحصول على زر الرجوع.ثم يمكن استخدام خدعة للضغط على زر الرجوع: http://smallduck.wordpress.com/2010/10/05/intercepting-uinavigationcontroller/

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

تشرح Apple كيفية عمل تطبيق جهات الاتصال تحت الغطاء:

للسماح باستخدام فئة وحدة تحكم العرض المخصصة لعرض المحتوى وتحريره، قم بتجاوز setEditing:animated: طريقة.

يمكنك الحصول على بعض الوظائف مجانًا، على سبيل المثال. Edit/Done زر.

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