به نام خدا

یکی از مفاهیم اصلی و مهم ای او اس بخش فایل های xib و  nib میباشد. که به نظرم باید هر برنامه نویس ios اونا رو خوب بلد باشه تا بتونه یه برنامه خوبی رو توسعه بده.

Nib چیه؟

وقتی فایل های Xib کامپایل میشن تبدیل به Nib میشن که UINibDecoder اون ها رو میخونه (این فایل ها توی سورس هر پروژه ای قابل دسترسی هستن)

Xib چیه؟

فایل هایی که ویو ها رو توشون میریزیم (یا به اصطلاح فایل های xml که توش نمادگذاری ها انجام میشن)

هر فایل Xib شامل دو بخش میشه یکی TopLevel ها و دومی FileOwner

برای ساخت یک فایل Xib به سادگی میتونید روی هر فولدری توی ایکس کد راست کلیک کنید و گزینه New File رو انتخاب کنید و از توی منویی که در پیش رو دارید به دنبال ٰView بگردید و یه اسمی براش انتخاب کنید اینجوری یه فایل Xib ساخته میشه که توش یه UIView وجود داره

Top Levels چیست؟

به ویو های داخل یک Xib که هیچ سوپر ویویی اون ها رو در برنگرفته TopLevel میگن

توجه کنید که خیلی جاها ما مجبوریم که توی یک فایل Xib یک و تنها یک TopLevel داشته باشیم مگرنه برناممون کرش میکنه مثلا وقتی دارید یه nib رو توی یه TableView ریجیستر میکنید

 

FileOwner چیه؟

مبحث خیلی مهمیه که FileOwner چیه و اگه نباشه مگه ما نمیتونیم به همون ویو یه کلاس بدیم به عنوان  Custom Class جواب خیر هست

شما یه ویو دارید که باید توسط یه چیزی کنترل بشه فکر کنید یه فایل نیاز دارید که توش outlet ها باشن و یه سری توابع برای کار با این outlet ها چقدر این مفهوم آشناست. درسته دقیقا ViewController که همونجوری که اسمش روشه قراره View شما رو Control کنه کلاس های ViewController یه File'sOwner هستند برای ویویی که داخلشون قرار گرفته ViewController ها خودشون ویو نیستن ولی یه Outlet دارن که اسمش View هست و این وصل میشه به TopLevel اون فایل Xib (یا اگه توی استوری برد هستید میشه همون ویوی روتی که سایر ویو ها رو توش میسازید)

اصلا ممکنه شما در جایی نیاز داشته باشید که یه ویو رو با دوتا کنترلر بنا به شرایط خاصی بالا بیارید یه بار با یه کنترلر و دفعه دیگه با کنترلر دیگه ای.

پس میتونید File's Owner اون رو تنظیم کنید (از توی کد)

چجوری یه ویو رو توی xib بسازیم و به اون از توی کد دسترسی داشته باشیم؟

خیلی ساده با استفاده از کد زیر به اولین TopLevel دسترسی پیدا میکنید:

UINib(nibName: "MyNib", bundle: nil).instantiate(withOwner: nil, options: nil)

دقت کنید که withOwner داره File'sOwner رو میده و همیشه برای اینکه بتونید File'sOwner بدید باید ابتدا از اون کلاس یه آبجکت ایجاد کنید و توی یه متغییر بریزید و بعدش اون متغییر رو بدید به این پارامتر بعد از اون هم میتونید برای کنترل اون ویو از اون File'sOwner یا همون متغییری که ساختید استفاده کنید‌ (دقت کنید برای استفاده از اون حتما باید nibLoad شده باشه یعنی این ویو به یه جایی Add کرده باشید.

ViewController ها رو هم میشه توی فایل Xib ریخت کافیه که وقتی دارید یه ویو کنترلر میسازید تیک Create Xib رو هم بزنید تا خودش فایل Xib رو بسازه و File'sOwner اون Xib رو همین کلاسی قرار بده که با Xib ساخته میشه.

حالا هم هرموقع خواستید ویو کنترلر رو اجرا کنید کافیه فقط کلاسش رو New کنید و با navigationController?.push یا present بازش کنید.

چجوری کار میکنه؟

همه کلاس های ویوکنترلر وقتی میخوان ساخته بشن توی تابع initشون یه xibName میگیرن که اسم همون فایل xib هست اگه بهشون ندیم اسم همون کلاس رو string میکنن و دنبال فایل xib با همون اسم میگردن (البته در صورتی که توی کد به اون شکل ساخته بشن مگرنه میدانیم وقتی داریم از استوری برد استفاده میکنیم اول استوری برد رو میگیریم و سپس توسط storyboard Identifier اون xib مربوطه را میسازیم) (استوری برد جایی هست که فقط ViewController ها تاپ لول های اونا هستن و نمیتونه مستقیما View اونجا TopLevel باشه)

خب یاد گرفتیم که میشه UINib رو به اون شکل ساخت به این شکل هم(که مخصوص ViewController ها هست) ساخت یه روش دیگه هم هست که به شکل:

Bundle.main.loadNibNamed("nibName", owner: nil, options: nil)?.first

ساخت که اولین ویو یا همون اولین تاپ لول رو به ما برمیگردونه (بدون File'sOwner)

امیدوارم مطالب براتون کاربردی باشه

موفق باشید

در پناه حق