Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. iOS
Code

دائرة الرقابة الداخلية "من الصفر مع سويفت": بناء التطبيق قائمة التسوق 1

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called iOS From Scratch With Swift.
iOS From Scratch With Swift: Data Persistence and Sandboxing on iOS
iOS From Scratch With Swift: Building a Shopping List Application 2

Arabic (العربية/عربي) translation by Ade Khairul Umam (you can also view the original English article)

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

مخطط تفصيلي

تطبيق قائمة التسوق نحن على وشك إنشاء سمات اثنين، إدارة قائمة بالبنود وإنشاء قائمة تسوق عن طريق تحديد العناصر من القائمة.

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

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

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

1-إنشاء المشروع

إطلاق Xcode وإنشاء مشروع جديد استناداً إلى قالب "تطبيق عرض واحد" في دائرة الرقابة الداخلية > قسم التطبيق.

Choosing the Single View Application Template

اسم المشروع قائمة التسوق، وأدخل اسم المؤسسة والمعرف. تعيين اللغة إلى سويفت والأجهزة لأي فون. تأكد من أن خانات الاختيار في الجزء السفلي من دون رادع. أقول Xcode فيها حفظ المشروع ثم انقر فوق إنشاء.

Configuring the Project

2-إنشاء وحدة تحكم عرض قائمة

كما قد يكون هو متوقع، وحدة تحكم عرض قائمة ستكون فئة فرعية أويتابليفيوكونترولير. قم بإنشاء فئة جديدة بتحديد جديد > الملف من قائمة الملفات... حدد "فئة تعمل باللمس الكاكاو" من دائرة الرقابة الداخلية > المصدر الباب.

Creating a Cocoa Touch Class

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

Configuring the List View Controller Class

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

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

Adding a Tab Bar Controller

قائمة عرض المراقب المالي يجب أن يكون وحدة تحكم عرض جذر وحدة التحكم بالتنقل. حدد وحدة تحكم عرض قائمة واختر تضمين في > "تحكم التنقل" من القائمة تحرير.

Embedding the List View Controller in a Navigation Controller

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

Running the Application for the First Time

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

3. إنشاء فئة نموذج العنصر

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

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

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

قم بإنشاء فئة جديدة، البند، وتجعل من فئة فرعية NSObject. أقول Xcode أين حفظ الفئة وانقر فوق إنشاء.

خصائص

فتح Item.swift وتعلن أربع خصائص:

  • uuid نوع String شكل فريد كل عنصر
  • اسم نوع السلسلة
  • اكتب سعر عائم
  • إينشوبينجليست نوع Bool تشير إلى إذا كان العنصر موجود في قائمة التسوق

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

يحتاج كل خاصية قيمة أولية. نحن تعيين اسم سلسلة فارغة، والأسعار إلى 0.0، وإينشوبينجليست إلى false. لتعيين القيمة الأولية من uuid، نجعل استخدام فئة لم نر من قبل، نسوويد. وتساعد هذه الفئة لنا إنشاء سلسلة فريدة أو UUID. نحن تهيئة مثيل للفئة وأطلب أنه UUID كسلسلة باستدعاء UUIDString().

إعطائها عن طريق إضافة التعليمات البرمجية المتكررة التالية إلى الأسلوب viewDidLoad() للفئة ليستفيوكونترولير.

قم بتشغيل التطبيق وإلقاء نظرة على الإخراج في وحدة التحكم ل Xcode مشاهدة ما يشبه UUID الناتجة عن ذلك. سترى شيئا مثل هذا:

الأرشفة

استراتيجية واحدة لحفظ الكائنات المخصصة على القرص، مثل مثيلات الفئة عنصر، يتم من خلال عملية تعرف باسم الأرشفة. سوف نستخدم نسكيدارتشيفير ونسكيييدونارتشيفير للأرشيف وإلغاء الأرشفة مثيلات فئة البند.

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

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

تذكر من الدرس حول إطار المؤسسة، تعلن بروتوكول نسكودينج اثنين من الأساليب التي يجب أن تنفذ فئة للسماح بمثيلات الفئة إلى ترميز وفك ترميز. دعونا نرى كيف يعمل هذا.

ترميز

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

فك التشفير

كلما كائن مرمزة تحتاج إلى تحويله إلى مثيل من الفئة المعنية، يتم استدعاء init(coder:). يتم استخدام نفس المفاتيح التي استخدمناها في encodeWithCoder(_:) في init(coder:). وهذا مهم جداً.

علما أننا نستخدم الكلمة الأساسية المطلوبة. تذكر أن غطينا الكلمة الأساسية المطلوبة في وقت سابق من هذه السلسلة. لأن decodeObjectForKey(_:) بإرجاع كائن من النوع أنيوبجيكت؟، يمكننا تحويل فإنه إلى كائن String.

ينبغي أن ابدأ مباشرة استدعاء init(coder:) و encodeWithCoder(_:). ودعوا فقط من نظام التشغيل. بمطابقة فئة العنصر في بروتوكول نسكودينج، علينا فقط أن أقول نظام التشغيل كيفية ترميز وفك ترميز مثيلات الفئة.

إنشاء مثيلات

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

فتح Item.swift وإضافة مهيئ التالية. تذكر أن المهيآت لم يكن لديك الكلمة الرئيسية أمام اسمها func. ونحن أولاً استدعاء مهيئ للفئة الفائقة، NSObject. نحن ثم تعيين خصائص مثيل عنصر الاسم والسعر.

يمكن أن يتساءل لماذا نستخدم self.name في init(name:price:) واسم في init(coder:) لتعيين اسم الخاصية. في كلا السياقين، مراجع الذاتي مثيل عنصر نحن كنت التفاعل مع. في سويفت، يمكنك الوصول إلى خاصية دون استخدام الكلمة الأساسية الذاتية. ومع ذلك، في init(name:price:) إحدى المعلمات له اسم مطابق لإحدى خصائص فئة البند. لتجنب الارتباك، يمكننا استخدام الكلمة الذاتي. وباختصار، يمكنك حذف الكلمة الأساسية الذاتية الوصول إلى خاصية ما لم يكن هناك سبب للارتباك.

4. تحميل وحفظ العناصر

استمرار البيانات سوف يكون المفتاح في تطبيق قائمة التسوق لدينا لذلك دعونا نلقي نظرة على كيف سنقوم بتنفيذ استمرار البيانات. فتح ListViewController.swift وتعلن خاصية تخزين متغير، والعناصر، من نوع [البند]. لاحظ أن القيمة الأولية لعناصر صفيف فارغ.

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

في المهيئ للفئة، ونحن تحميل قائمة العناصر من القرص وتخزينها في الخاصية العناصر التي أعلنا قبل لحظات قليلة.

LoadItems() الأسلوب عرض المراقب المالي، ليس أكثر من أسلوب مساعد للحفاظ الحرف الأول؟ (المبرمج:) طريقة مختصرة وقابلة للقراءة. دعونا نلقي نظرة على تنفيذ loadItems().

تحميل العناصر

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

ماذا نحن لم تغطي حتى الآن هو أين الكلمة الأساسية في إذا كان البيان. باستخدام حيث الكلمة الرئيسية، نضيف قيداً إضافيا إلى شرط if البيان. في loadItems()، نتأكد من pathForItems() تقوم بإرجاع سلسلة. تستخدم فيها شرط، نحن أيضا التحقق من أن قيمة filePath يتوافق مع ملف على القرص. يمكننا استخدام فئة نسفيليماناجير لهذا.

نسفيليماناجير هي فئة لم تكن قد عملت مع بعد. فإنه يوفر API سهلة الاستخدام للعمل مع نظام الملفات. ونحن الحصول على مرجع إلى مثيل من الفئة بطلب من إدارة الافتراضية.

ونحن ثم استدعاء fileExistsAtPath(_:) في إدارة الافتراضية، يمر في مسار الملف حصلنا في السطر الأول من loadItems(). إذا كان هناك ملف موجود في الموقع المحدد بواسطة مسار الملف، ونحن تحميل محتويات الملف في الخاصية العناصر. إذا كان لا ملف موجود في هذا الموقع، الخاصية العناصر يحتفظ قيمته الأولية، صفيف فارغ.

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

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

الأسلوب بإرجاع المسار إلى الملف الذي يحتوي على قائمة البنود للتطبيق. نحن نفعل هذا بجلب المسار لدليل الوثائق رمل للتطبيق وإلحاق "العناصر" لأنها.

جمال استخدام URLByAppendingPathComponent(_:) أن يتم إدراج فواصل المسار بالنسبة لنا حيثما كان ذلك ضروريا. وبعبارة أخرى، النظام يجعل التأكد من أن نتلقى URL ملف صالح. ملاحظة أننا استدعاء path() على مثيل نسورل الناجمة عن ذلك للتأكد من أننا إرجاع كائن String.

حفظ العناصر

على الرغم من أننا لن يكون حفظ العناصر حتى وقت لاحق في هذا الدرس، أنها لفكرة جيدة لتنفيذ بينما نحن على ذلك. تنفيذ saveItems() مختصر جداً بفضل الأسلوب المساعد pathForItems().

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

من المعروف عملية كتابة رسم كائن إلى القرص الأرشفة. يمكننا استخدام فئة نسكيدارتشيفير لإنجاز هذا بواسطة استدعاء archiveRootObject(_:toFile:) في نسكيدارتشيفير.

أثناء هذه العملية، كل كائن في الرسم البياني الكائن يتم إرسال رسالة encodeWithCoder(_:) لتحويلها إلى بيانات ثنائية. تذكر أنه يندر أن تكون هناك حاجة إلى استدعاء encodeWithCoder(_:) مباشرة.

للتحقق من ذلك بتحميل قائمة العناصر من القرص ويعمل، إضافة بيان طباعة إلى الأسلوب viewDidLoad() للفئة ليستفيوكونترولير. قم بتشغيل التطبيق في المحاكاة والتحقق إذا كان كل شيء يعمل.

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

5-زرع البذور في مخزن البيانات

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

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

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

فتح AppDelegate.swift وتعديل تنفيذ application(_:didFinishLaunchingWithOptions:) لتبدو وكأنها واحدة هو موضح أدناه.

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

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

يمكن أن يكون المفتاح كل ما تريد طالما أنك متسقة في تسمية المفاتيح التي يمكنك استخدامها. يخبرنا المفتاح في قاعدة البيانات الافتراضية المستخدم سواء أكان الفعل المصنف التطبيق مع البيانات. هذا أمر مهم نظراً لأننا نريد فقط أن البذور التطبيق مرة واحدة.

إذا لم تم تبذر التطبيق حتى الآن، ونحن تحميل قائمة بممتلكات من حزمة التطبيق، seed.plist. هذا الملف يحتوي على صفيف قواميس بكل قاموس تمثل عنصر باسم وسعر.

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

وأخيراً، ونحن إنشاء المسار إلى الملف الذي سوف نقوم بتخزين قائمة البنود ونكتب محتويات صفيف عناصر القرص كما رأينا في الأسلوب saveItems() من ليستفيوكونترولير.

ArchiveRootObject(_:toFile:) الأسلوب بإرجاع true إذا انتهت العملية بنجاح، وهذا فقط ثم نقوم بتحديث قاعدة البيانات الافتراضية المستخدم عن طريق تعيين قيمة منطقية لمفتاح "أوسيرديفاولتسيديتيمس" إلى true. في المرة القادمة التي تطلق التطبيق، لن يكون المصنف مخزن البيانات مرة أخرى.

ربما كنت قد لاحظت أن استخدمنا أسلوب مساعد آخر في seedItems()، pathForItems(). تنفيذه مطابق للفئة ليستفيوكونترولير.

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

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

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

6-عرض قائمة العناصر

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

هناك اثنين من التفاصيل نحن بحاجة إلى رعاية من قبل تشغيل التطبيق ويعلن سيليدينتيفير المستمر وتقول طريقة العرض جدول الفئة التي لاستخدامها لإنشاء طريقة عرض خلايا الجدول.

وبينما كنت في ذلك، تعيين خاصية العنوان لوحدة تحكم عرض قائمة على "البنود".

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

Populating the List View Controller With Items

7. إضافة عناصر-الجزء 1

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

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

خطوة 1: إضافة زر

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

لقد تعلمنا في الدرس حول وحدات تحكم شريط التبويب، أن لدى كل وحدة تحكم عرض خاصية تاباريتيم. وبالمثل، كل عرض المراقب المالي يحتوي على خاصية نافيجاتيونيتيم، مثيل فريد من أوينافيجاتيونيتيم تمثل وحدة تحكم العرض في شريط التنقل لوحدة تحكم عرض الأصل – وحدة تحكم التنقل.

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

في viewDidLoad()، ونحن تعيين الخاصية ليفتباربوتونيتيم من نافيجاتيونيتيم عرض المراقب المالي إلى مثيل أويباربوتونيتيم باستدعاء init(barButtonSystemItem:target:action:)، يمر في. إضافة كالوسيطة الأولى. الوسيطة الأولى من نوع أويباربوتونسيستيميتيم، قائمة تعداد. والنتيجة نسخة النظام توفيرها من أويباربوتونيتيم.

المعلمة الثانية والثالثة من init(barButtonSystemItem:target:action:) على الرغم من أن لقد واجهنا فعلا نمط العمل المستهدفة، يحتاج تفسيراً. كلما يتم استغلالها بزر في شريط التنقل، يتم إرسال رسالة addItem(_:) الهدف، أي النفس أو مثيل ليستفيوكونترولير.

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

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

يتم تخزين الرسالة كمحدد. انتظر دقيقة. ما هو محدد؟ محدد هو الاسم أو معرف فريد يستخدم لتحديد أسلوب كائن المتوقع لتنفيذ. يمكنك قراءة المزيد حول محددات في دليل "الكفاءات الأساسية الكاكاو" أبل.

قبل تشغيل التطبيق في المحاكاة، نحن بحاجة إلى إنشاء أسلوب addItem(_:) المقابلة في وحدة تحكم عرض قائمة. إذا لم نفعل ذلك، ليس وحدة تحكم عرض قادرة على الرد على الرسالة التي تتلقاها عند الزر هو استغلالها ويتم طرح استثناء، تعطل التطبيق.

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

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

الخطوة 2: إنشاء وحدة تحكم العرض

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

نحن بحاجة أيضا إلى إعلان اثنين من الإجراءات في AddItemViewController.swift. الإجراء الأول، cancel(_:)، يلغي إنشاء عنصر جديد. الإجراء الثاني، save(_:)، يستخدم إدخال المستخدم لإنشاء وحفظ عنصر جديد.

فتح Main.storyboard واسحب مثيل UIViewController من "مكتبة الكائن" في مساحة العمل، وتعيين الفئة الخاصة به إلى أديتيمفيوكونترولير في "المفتش الهوية".

Creating the Add Item View Controller Class

إنشاء دليل segue بالضغط على عنصر التحكم وسحب من كائن "وحدة التحكم بعرض قائمة" "إضافة عنصر تحكم عرض" الكائن. حدد "هذا مشروط" من القائمة للملوثات العضوية الثابتة.

Creating a Segue to the Add Item View Controller
Creating a Segue to the Add Item View Controller

حدد سيجا قمت توا بإنشائه وفتح "المفتش سمات" تعيين المعرف الخاص به إلى أديتيمفيوكونترولير.

Configuring the Segue to the Add Item View Controller

قبل أن يمكننا إضافة حقول النص، حدد إضافة عنصر عرض المراقب المالي وتضمين ذلك في وحدة تحكم تنقل عن طريق تحديد تضمين في > "تحكم التنقل" من القائمة تحرير.

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

Configuring the Navigation Bar of the Add Item View Controller

حدد الكائن "إضافة عنصر تحكم عرض" وفتح "المفتش اتصالات" على الحق الاتصال العمل cancel(_:) مع اليسار بار عنصر زر والعمل save(_:) مع الحق في بار عنصر زر.

Connecting the Actions in the Connections Inspector

اسحب مثيلين أويتيكستفييلد من "مكتبة الكائن" إلى العرض لإضافة عنصر عرض المراقب المالي. قم بوضع الحقول النصية كما هو موضح أدناه. لا تنسى أن إضافة القيود اللازمة لحقول النص.

Adding Text Fields to the Add Item View Controller

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

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

الخطوة 3: تنفيذ addItem(_:)

مع أديتيمفيوكونترولير جاهزة للاستخدام، ولإعادة النظر في الإجراء addItem(_:) في ليستفيوكونترولير. يتم تنفيذ addItem(_:) قصيرة كما ترون أدناه. ونحن استدعاء performSegueWithIdentifier(_:sender:)، يمر في المعرف أديتيمفيوكونترولير وضعناها في لوحة العمل والنفس، وعرض المراقب المالي.

الخطوة 4: رفض عرض المراقب المالي

أيضا ينبغي أن يكون المستخدم قادراً على إغلاق وحدة تحكم العرض بالنقر فوق الزر إلغاء الأمر أو حفظ الزر لإضافة عنصر عرض المراقب المالي. إعادة النظر في الإجراءات cancel(_:) و save(_:) في أديتيمفيوكونترولير وتحديث التطبيقات الخاصة بهم كما هو مبين أدناه. وسوف نعيد النظر في الإجراء save(_:) قليلاً في وقت لاحق في هذا البرنامج التعليمي.

وحدة تحكم عرض مشروط عندما ندعو dismissViewControllerAnimated(_:completion:) على وحدة تحكم عرض طريقة العرض التي تعرض مشروط، توجيه تلك الرسالة إلى وحدة تحكم العرض الذي قدم عرض المراقب المالي. في المثال الخاص بنا، وهذا يعني أن وحدة تحكم عرض البند إضافة إعادة توجيه الرسالة إلى وحدة تحكم التنقل، الذي، في دورها، يحيله إلى وحدة تحكم طريقة عرض القائمة. الوسيطة الثانية من dismissViewControllerAnimated(_:completion:) هو إغلاق التي يتم تنفيذها عندما يتم الانتهاء من الرسوم المتحركة.

قم بتشغيل التطبيق في محاكاة لرؤية الطبقة أديتيمفيوكونترولير في العمل. عند النقر فوق حقل النص الاسم أو السعر، لوحة المفاتيح ينبغي تلقائياً يطفو على السطح من الأسفل.

Adding an Item in the Add Item View Controller

7. إضافة عناصر--الجزء 2

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

يمكن حل المشكلة التي نحن نواجه بتنفيذ بروتوكول مندوب مخصصة. دعونا نرى كيف يعمل هذا.

الوفد

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

ينبغي أن يكون مندوب الكائن كائن مطابقة لبروتوكول مخصص مفوض أن نحدد. والأمر متروك لكائن التفويض تحديد ما ينبغي القيام به مع المعلومات التي يرسل جهاز تحكم عرض البند إضافة. إضافة البند عرض المراقب المالي مسؤولة فقط عن التقاط الإدخال الخاص بالمستخدم وإخطار مندوبها.

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

كتذكير، إعلان بروتوكول يحدد أو تعلن الأساليب والخصائص التي ينبغي أن تنفذ الكائنات المطابقة للبروتوكول. مطلوب من كل أسلوب وخاصية في بروتوكول سريعة.

نحن أيضا بحاجة إلى تعريف خاصية للمفوض. المفوض من نوع أديتيمفيوكونتروليرديليجاتي؟. ملاحظة علامة الاستفهام، مشيراً إلى أنه من نوع اختياري.

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

إخطار المندوب

لقد حان الوقت لاستخدام بروتوكول المفوض أن أعلنا منذ لحظة. إعادة النظر في أسلوب save(_:) في فئة أديتيمفيوكونترولير واستكمال تنفيذه كما هو موضح أدناه.

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

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

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

وردا على حفظ الأحداث

الجزء الأخير من اللغز جعل ليستفيوكونترولير يتوافق مع البروتوكول أديتيمفيوكونتروليرديليجاتي. فتح ListViewController.swift وتحديث إعلان واجهة ليستفيوكونترولير لجعل فئة مطابقة للبروتوكول الجديد.

ونحن الآن بحاجة لتطبيق الأساليب المحددة في البروتوكول أديتيمفيوكونتروليرديليجاتي. في ListViewController.swift، أضف التالي تنفيذ controller(_:didSaveItemWithName:andPrice:).

أننا إنشاء مثيل عنصر جديد باستدعاء init(name:price:)، تمرير في اسم والأسعار التي نتلقاها من إضافة عنصر عرض المراقب المالي. في الخطوة التالية، يتم تحديث الخاصية العناصر عن طريق إضافة هذا البند الذي تم إنشاؤه حديثا. وبطبيعة الحال، لا طريقة العرض جدول automagically تعكس إضافة عنصر جديد. نحن يدوياً إدراج صف جديد في طريقة عرض الجدول. لحفظ التغييرات إلى القرص، وندعو saveItems() عرض المراقب المالي، الذي قمنا في وقت سابق من هذا البرنامج التعليمي.

تعيين المفوض

الجزء الأخير من هذا اللغز المعقد إلى حد ما تعيين مندوب إضافة البند عرض المراقب المالي عند تقديمها إلى المستخدم. أننا نفعل ذلك في prepareForSegue(_:sender:) كما رأينا في وقت سابق من هذه السلسلة.

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

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

قم بتشغيل التطبيق مرة أخرى لترى كيف يعمل كل شيء معا – كما لو كان بفعل السحر.

الاستنتاج

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

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.