سؤال

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

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

هل من الممكن أن تفعل هذا؟أو لاسترداد وحدة التحكم المضمنة عبر علامة أو شيء ما في الكود؟

هذا السؤال يتعلق بشكل خاص باستخدام طرق عرض الحاوية

هل كانت مفيدة؟

المحلول

لست متأكدا مما تعنيه "استرداد وحدة التحكم المضمنة".عندما ترغب في استخدام وحدة تحكم، تستخدم طريقة UIStoryboard InstantiVeViewControllerwithidifidifient:، باستخدام المعرف الذي تقدمه إلى وحدة التحكم في IB.يمكنك أيضا استخدام ardseguewithidentifiertifier: SENERTER: الطريقة (التي قمت أيضا بإنما فعل أيضا وحدة تحكم العرض).يجب عليك التحقق من قسم "استخدام وحدات التحكم" في تطبيق التطبيق الخاص بك في مستندات Apple.كما أنه يشير إلى حقيقة أن وحدات تحكم عرض الأطفال يتم إنشاء مثيل في نفس الوقت الذي تحكم الحاويات.

بعد تحرير: إذا قمت بتضمين عرض حاوية في وحدة تحكم عرض أخرى، فيمكن الإشارة إلى وحدة تحكم العرض المضمنة من وحدة التحكم المحتوية مع Self.childViewControllers (والتي ستكون مجموعة، لذلك إذا كان هناك واحد فقط، يمكنك الحصول عليهمع lastobject).

نصائح أخرى

هناك خيار آخر في بعض الحالات وهو التقاط وحدة التحكم المضمنة باستخدام -prepareForSegue:sender:.

على سبيل المثال، إذا كان لدي UINavigationController مضمن داخل أ CustomContainerViewController, ، يمكنني تسمية جزء التضمين embedContentStack في القصة المصورة والتقاطها CustomContainerViewController عبر

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"embedContentStack"]) {
        // can't assign the view controller from an embed segue via the storyboard, so capture here
        _contentStack = (UINavigationController *)segue.destinationViewController;
    }
}

ملاحظة الحذر

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

على سبيل المثال، إذا كنت تقوم بتضمين أ UICollectionViewController فئة فرعية، هل يمكنك بدلاً من ذلك تضمين ملف UICollectionView فئة فرعية؟أو، حتى أفضل، هل يمكنك تضمين ملف UIView فئة فرعية تخفي بعيدا UICollectionView وراء ViewModel بسيط؟

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

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

خلفية

أنا أستخدم أسلوب التقاط الجزء المضمن prepare(for segue:, sender:) كما اقترح المهوس لعوب هنا.

أردت أن أظهر السرعة التي أستخدمها لهذا الغرض، حيث يبدو أنها مرتبة إلى حد ما ...

class EditionLandingViewController: UIViewController {
    fileprivate var titlesView: SectionTitlesViewController!
    fileprivate var sectionsView: SectionsViewController!
}

//MARK:-

extension EditionLandingViewController {
    private enum SegueId: String {
        case embedTitles
        case embedSections
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        guard
            let segueRawId = segue.identifier,
            let segueId = SegueId(rawValue: segueRawId)
            else { return }

        switch segueId {
        case .embedTitles:
            self.titlesView = segue.destination as! SectionTitlesViewController

        case .embedSections:
            self.sectionsView = segue.destination as! SectionsViewController
        }
    }
}

مناقشة

لقد اخترت أن مقاطع الاسم كطرق عمل.

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

الحفاظ على معرفات Segue في أ private enum في حدود extension يبدو النطاق مناسبًا في هذه الحالة نظرًا لعدم الحاجة إلى هذه المقاطع في أي مكان آخر (لا يمكن أن تكون كذلك performإد، على سبيل المثال).

أنا أستخدم الأنواع غير المغلفة ضمنيًا لوحدات التحكم في العرض المضمنة لأنه (في حالتي على أي حال) يعد خطأ منطقيًا إذا كانت مفقودة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top