სთორიბორდები ყველა ოჯახში

Shota Ioramashvili
2 min readMay 21, 2018

--

თუ სთორიბორდებს იყენებთ, იმის ალბათობა რომ პროექტში ერთზე მეტი გექნებათ დიდია. რამოდენიმე სთორიბორდის შემთვევაში, სხვადასხვა სთორიბორდისა და ვიუკონტროლერის კოდით შექმნა უკვე აჩენს გარკვეულ პრობლემას. თუნდაც UIStoryboard კლასის ინიციალიზატორი, რომელსაც სთორიბორდის სახელი სტრინგად გადაეცემა. ასევე სთორიბორდის instantiateViewController(withIdentifier:) მეთოდი, რომელსაც კონტროლერის იდენტიფიკატორი სტრინგად გადაეცემა. ეს ყველაფერი უნდა აღიკვეთოს.

მინდა შემოგთავაზოთ type safe მიდგომა, რომელიც დაგეხმარებათ მარტივად შექმნათ სთორიბორდების ჩამონათვალი და ასევე მოახდინოთ სასურველი კონტროლერის ინიციალიზაცია.

სანამ განხილვაზე გადავალთ, წარმოვიდგინოთ პროექტი:

პროექტში გვაქვს ორი სთორიბორდი: S0 და S1. შესაბამისად S00VC და S01VC ვიუკონტროლერები განთავსებულია S0 სთორიბორდზე, ხოლო S10VC, S11VC და S12VC განთავსებულია S1 სთორიბორდზე. AppStoryboard ფოლდერში წარმოდგენილია ინფრასტრუქტურის მოსაწყობად საჭირო ფაილები, რომელსაც მალე განვიხილავთ.

პირველ რიგში ვნახოთ სტანდარტული და შემოთავაზებული მიდგომა:

სანამ დავიწყებთ, დავდოთ ერთი შეთანხმება. ყველა ვიუკონტროლერის Storyboard ID არის მისივე სახელი. ესეიგი S00VC სცენის Storyboard ID იქნება S00VC სტრიქონი. ამისთვის დავწეროთ პაწაწინა ექსთენშენი NSObject-ზე:

აწი თუ დავწერთ S00VC.className, დაგვიბრუნება “S00VC” სტრიქონი. ამ შეთანხმებას და ფუნქციონალს მომავალში გამოვიყენებთ.

მოვყვეთ ბოლოდან და ვნახოთ თუ როგორი იქნება სთორიბორდების ჩამონათვალი ჩვენი აპლიკაციისთვის:

AppStoryboard ენამია, რომლის rawValue არის String. UIStoryboardRepresentable პროტოკოლის განმარტების შემდეგ მივხვდებით რატომ აღვწერეთ AppStoryboard მსგავსი მიდგომით.

განვმარტოთ UIStoryboardRepresentable:

როგორც ვხედავთ პროტოკოლი გვავალდებულობს ერთი storyboard read only ფროფერთის აღწერას, რომელიც თავის მხრივ იმპლემენტირებულია ექსთენშენში. თუ დააკვირდებით UIStoryboardRepresentable-ის ექსთენშენის პირობას აკმაყოფილებს ჩვენ მიერ ზემოთ აღწერილი AppStoryboard ენამი. სწორედ ამ ექსთენშენის დამსახურებით არ ვიყავით ვალდებულნი AppStoryboard ენამში storyboard read only ფროფერთის ტანი წარმოგვედგინა.

ალბათ თვალში ცუდად მოგხვდათ UIStoryboardInstantiatable პროტოკოლი, რომლის იმპლემენტაციის ვალდებულებაც აქვს UIStoryboardRepresentable პროტოკოლს.

მოდით ვნახოთ რას გვავალდებულებს UIStoryboardInstantiatable:

შეიძლება ითქვას, UIStoryboardInstantiatable-ის მეთოდებით შეფუთულია სთორიბორდის სტანდარტული instantiateViewController(withIdentifier:) და instantiateInitialViewController() მეთოდები.
ალბათ გაგიჩნდათ კითხვა თუ რატომ არ აღწერს UIStoryboardRepresentable ან AppStoryboard, UIStoryboardInstantiatable-ის მეთოდებს. ეს პრობლემა მოგვარებულია UIStoryboardInstantiatable-ის ექსთენშენში სადაც Self არის UIStoryboardRepresentable.

ამით დასრულებულია ინფრასტუქტურისთვის საჭირო მეთოდების აღწერა. იმის გარდა რომ ეს მიდგომა არის type safe, ასევე საგრძნობლად ამცირებს კოდის ზომას. უფრო გიადვილებთ კონკრეტული სთორიბორდის სახელის ცვლილებას. აღნიშნული მიდგომა უფრო თანმიმდევრულია და საგრძნობლად არის შეფუთული სტანდარტული API.

თუ თქვენ აპლიკაციაში მოახდენთ აღნიშნული მიდგომის დანერგვას, მხოლოდ ჩამონათვალის გაკეთებაღა დაგჭირდებათ.

კარგად.

--

--