ios لا يمكن تحميل ملف إيفيوكونترولر زيب في القصة المصورة في سويفت




uiviewcontroller swift (2)

ما حدث هو أن البذور 5 كسر آلية حيث وحدة تحكم عرض يمكن العثور على زيب بالاسم، إذا كان المراقب عرض هو فئة سويفت. والسبب هو أن اسم الطبقة، في العقل سويفت، ليست هي نفس الاسم الذي أعطيته (واسم أعطيت ملف زيب). كان اسم "مانغلد"، ولا سيما عن طريق الإيداع المسبق لاسم الوحدة النمطية (أي الطبقات سويفت لها نامسباسينغ).

أقدم ثلاثة حلول:

  • الحل البديل الخاص بك هو واحد جيد (تحميل ملف .xib بالاسم صراحة)

  • اسم الملف .xib MyModule.TestViewController.xib ، حيث MyModule هو اسم الحزمة الخاصة بك (أي اسم المشروع) (وهذا ما تنصح أبل، ولكن أكره ذلك)

  • استخدام @objc(TestViewController) قبل عرض class المراقب المالي عرض للتغلب على اسم مانغلينغ وهو ما هو كسر آلية (وهذا هو النهج أنا صالح)

انظر مناقشتنا هنا: https://stackoverflow.com/a/25163757/341994 و مزيد من المناقشة المرتبطة بها من هناك: https://stackoverflow.com/a/25152545/341994

إديت يتم إصلاح هذا الخطأ في دائرة الرقابة الداخلية 9 بيتا 4. إذا فشل البحث ملف المنقار، يوس 9 شرائط الآن اسم الوحدة النمطية من اسم فئة وحدة تحكم عرض وينفذ البحث ملف المنقار مرة ثانية.

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

أنا خلقت مستودع بسيط، https://github.com/jer-k/StoryboardTesting-Swift ، الذي يعرض النهج أعلاه.

تمكنت من حل المشكلة عن طريق إضافة وتجاوز لبدء

required init(coder aDecoder: NSCoder) {
    super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle())
}

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


إجابة أخرى هي:

override func loadView() {
    if #available(iOS 9, *) {
        super.loadView()
    } else {
        let classString = String(self.dynamicType)
        NSBundle.mainBundle().loadNibNamed(classString, owner: self, options: nil)
    }
}

لينك: http://japko.net/2014/09/08/loading-swift-uiviewcontroller-from-xib-in-storyboard/

تصحيح:

override var nibName: String? {
    get {
        let classString = String(self.dynamicType)
        return classString
    }
}
override var nibBundle: NSBundle? {
    get {
        return NSBundle.mainBundle()
    }
}

هذا يبدو أكثر جمالا. يعمل على دائرة الرقابة الداخلية 8/9 (ربما على دائرة الرقابة الداخلية 7 جدا، الذي يعرف ...))





xib