في الأسبوع الماضي بدأنا سلسلة خطوة خطوة في لغة C وسلسلة أخرى تعلم لغة #C وأعلنا عن أول درس في كل سلسلة في موضوعه. بعد ذلك أنزلنا دروس جديدة ضمن السلسلتين وهي

المتغيرات ضمن سلسلة خطوة خطوة في لغة C 

استقبال قيم من لوحة المفاتيح ضمن سلسلة خطوة خطوة في لغة C 

العمليات الحسابية ضمن سلسلة دورة في لغة #C

الشرط if ضمن سلسلة خطوة خطوة في لغة C

كما غيرنا تصميم المدونة لإزالة الملل وبعض الاشياء غير الضرورية بالموقع.


بالأمس بدأت  سلسلة خطوة خطوة في لغة C واليوم أبدأ سلسلة أخرى في لغة #C وستسير هاتين السلسلتين تزامناً مع بعضهما.

الدرس الأول في لغة #C:


اليوم بدأت سلسلة خطوة خطوة في لغة C وهي دروس في لغة البرمجة C وأعتذر من متابعي دروس تطوير تطبيقات iOS، فحالياً ليس لدي جهاز Mac ولكن أوجهكم لمتابعة دروس الأخ علي الزهراني على قناته.

الدرس الأول في لغة C


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

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


في هذا الدرس سنتعرف على حفظ واسترجاع البيانات من وإلى الملفات. وبهذا نصل إلى نهاية هذه الدورة.


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


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



في هذا الدرس سنتعرف على طريقة الدمج بين UITabBarController و UINavigationController.


في هذا الدرس سنقوم بعرض وذلك التنقل بين عدة شاشات باستخدام الألسنة tabs، عبر التحكم UITabBarController

لاحظت خطا بسيط في الفيديو، وهو أني نسيت إضافة self قبل أحد متغيرات tab.


الدورة المقدمة حالياً هي للمبرمجين عموماً، ولغة objective-c تختلف صياغتها النحوية عن أغلب اللغات المعروفة خصوصاً عند استدعاء الدوال وأفعال الكائنات. فمثلاً السطر التالي:

NSObject *object = [NSObject alloc] init];

يناظر من وجهة نظر نحوية فقط السطرين التاليين:

NSObject *object = NSObject.alloc();
object.init();

أو كما يلي في بعض لغات البرمجة

NSObject *object = NSObject->alloc();
object->init();

ما حدث هنا أننا استدعينا الدالة alloc من الصنف NSObject وأعادت لنا كائناً من الصنف NSObject ثم استدعينا الدالة init من هذا الكائن. حيث تقوم الدالة alloc بحجز مكان في الذاكرة لكائن من نوع NSObject في مثالنا، والدالة init تقوم بتهيئة هذا الكائن. وبالمناسبة لا تفصل أبداً بين alloc, init واجعلها في نفس السطر - أدري حقيقة ماذا سيحدث لوخالفت هنا - حيث تأخد الدالة init نتيجة الدالة alloc مباشرة،

قد يكون هذا المثال معقد لأنه استدعاء داخل استدعاء، لنأخذ المثال التالي:

[object release];

هذا السطر لو أردت تحويلة إلى طريقة معروفة ستكون كالتالي:

object.release();

أو كما يلي في بعض لغات البرمجة

object->release();

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

عند تعريف الدالة نضع نوع القيمة أو المؤشر الذي تعيده الدالة بين قوسين، كما يلي:

- (float)PI
{
     return 3.14
}

بدلاً من:

float PI()
{
     return 3.14
}

حسناً، ما معنى علامة - في البداية؟ هذه تدل على أن هذه الدالة فعل للكائن (instance method) ولو وضعنا علامة + تصبح دالة تستدعى من الصنف مباشرة (class method)

ماذا لو كانت الدالة تحتاج إلى عدة معطيات؟ هنا الأمر يصبح أكثر غرابة

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
..........
}

هذه الدالة اسمها :tableView:cellForRowAtIndexPath وتستقبل معطيين (وسيطين) أحدهما مؤشر من نوع UITableView واسمه tableView والآخرمؤشر من نوع NSIndexPath واسمه indexPath لاحظ كيف مررنا المعطيات في وسط اسم الدالة، هذه الدالة لو أردنا كتابتها بلغة أخرى كما فعلنا في الأعلى لكانت على الشكل التالي:

UITableViewCell* tableViewCellForRowAtIndexPath(UITableView* tableView, NSIndexPath* indexPath){
..........
}

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

أتمنى ممن قرأ الدرس أن يخبرني عن رأيه فيه.


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