it-swarm.dev

عرض التحكم المتداخل في iOS داخل طريقة العرض View Controller؟

هل عادةً ممارسة برمجة سيئة في iOS أن يكون لديك عرض وحدة تحكم عرض متداخلة داخل عرض UIViewController؟ قل على سبيل المثال أنني كنت أرغب في الحصول على نوع من العناصر التفاعلية التي تستجيب لمسات المستخدم ، لكن قد يستغرق الأمر 25٪ فقط من الشاشة.

أفترض أنني سأضيف وحدة تحكم العرض المتداخلة هذه إلى UIViewController بقول شيء مثل:

[self.view addSubview: nestedViewController.view];
84
Skyler

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

تنفيذ وحدة تحكم في طريقة عرض الحاوية

هذا سهل الإعداد بشكل لا يصدق باستخدام Interface Builder مع القصص المصورة أيضًا ، ألق نظرة على Container View في مكتبة الكائنات.

هنا مثال مفتعل في لوحة العمل. في هذا المثال ، سيكون لديك 4 وحدات تحكم في طريقة العرض ، واحدة تحتوي على 3 حاويات وواحدة لكل حاوية. عند تقديم أقصى وحدة تحكم تحتوي على كل الحاويات ، ستقوم Storyboard تلقائيًا بتهيئة وتضمين الأخرى 3. يمكنك الوصول إلى وحدات التحكم هذه في طريقة العرض الفرعية من خلال خاصية childViewControllers أو أن هناك طريقة يمكنك تجاوز prepareForSegue:sender: والتقاط طريقة العرض الوجهة تحكم من segue على وشك أن يسمى. يعد هذا أيضًا نقطة جيدة لتمرير الخصائص إلى وحدات تحكم العرض الفرعية إن وجدت.

enter image description here

137
Chris Wagner

أنا وضعت هذا الرمز في وحدة تحكم العرض الأصل. انه يعمل بشكل رائع بالنسبة لي.

Obj C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

سويفت :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

خيار آخر هو استخدام IB ووضع عرض الحاوية. سوف تظهر UIViewController تلقائيًا (XCode 9 في هذه الحالة):  enter image description here 

52
Maciek z Wrocławia

إليكم حل Swift 3 استنادًا إلى إجابة Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
5
Rajat Jain