সুইফট: কাস্টম ভিউকন্ট্রোলার প্রারম্ভিক


87

আপনি কীভাবে কাস্টম ইনিশিয়ালাইজার যুক্ত করবেন UIViewController সুইফটে সাবক্লাসে ?

আমি এর একটি উপ শ্রেণি তৈরি করেছি UIViewControllerযা দেখতে কিছুটা এমন দেখাচ্ছে:

class MyViewController : UIViewController
{
    init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
    {
        self.leftVC = leftVC;
        self.rightVC = rightVC;
        self.gap = gap;

        super.init();

        setupScrollView();
        setupViewControllers();
    }
}

আমি এটি চালানোর সময় আমি মারাত্মক ত্রুটি পাই:

মারাত্মক ত্রুটি: 'মাই অ্যাপ.মাইভিউকন্ট্রোলার' ক্লাসের জন্য অবিহিত আরম্ভকারী 'আরআইবি (নিবনেম: বান্ডেল :)' ব্যবহার করুন

আমি কোথাও পড়েছি যে একটি কাস্টম ইনিশিয়ালাইজার যুক্ত করার সময় একজনকেও ওভাররাইড করতে হয় init(coder aDecoder:NSCoder)তাই আসুন সেটিকে ওভাররাইড করে initদেখুন কী ঘটেছিল:

override init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);
}

আমি যদি এটি যুক্ত করি তবে এক্সকোড অভিযোগ করে self.leftVC is not initialized at super.init call। সুতরাং আমি অনুমান করি যে সমাধানও হতে পারে না। সুতরাং আমি অবাক হই যে আমি কীভাবে ViewControllerসুইফটের একটি সাবক্লাসে কাস্টম ইনিশিয়ালাইজারগুলি যুক্ত করতে পারি (যেহেতু অবজেক্টিভ-সিতে এটি কোনও সমস্যা বলে মনে হচ্ছে না)?


আপনি কীভাবে ইনস্ট্যান্ট করার চেষ্টা করছেন MyViewController?
মাইক পোলার্ড

ডিডলয়েড () -তে সমস্ত কিছু কেন ইনস্ট্যান্ট করবেন না, সেখানে আপনি যেভাবে চান ঠিক সেভাবে সেগুলি শুরু করতে পারেন
tudoricc

ডুয়ালভিউসিআরটিএল = ডুয়ালভিউসিআরটিএল সহ মাইকপোলার্ড (বামফিজি: এল, রাইটভিসি: আর, ফাঁক: ৫০) ... আমি ইতিমধ্যে জানতে পেরেছিলাম যে আমার সাথে ইনটুইডনিব ইনিশিয়ালাইজারটি ব্যবহার করা দরকার।
ব্যাডমিন্টনকিগ ২

4
@ টুডোরিক কারণ আপনি প্রায়শই সেই বৈশিষ্ট্যগুলি চান যা প্রদত্ত প্যারামিটারগুলি সহ নিরাপদে ইনিশিয়ালাইজারে সূচনা করা হয়। আপনি ভিডডিলোডে এটি করতে পারবেন না তখন থেকে এটি গ্যারান্টিযুক্ত হবে না যে প্রয়োজন অনুসারে সম্পত্তিগুলি উপলব্ধ।
ব্যাডমিন্টনকিগ

আমি দুঃখিত যে আমার মনে আমি ভিডিডলিড ()টিকে একটি প্রাথমিক হিসাবে দেখি। ব্যাখ্যার জন্য
থ্যাঙ্কস

উত্তর:


125

সমাধান! একজনকে মনোনীত ইনিশিয়ালাইজারকে কল করতে হবে যা এক্ষেত্রে নিবনামের সাথে আরম্ভ করে, স্পষ্টতই ...

init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
    self.leftVC = leftVC
    self.rightVC = rightVC
    self.gap = gap

    super.init(nibName: nil, bundle: nil)

    setupScrollView()
    setupViewControllers()
}

31
সেই কুৎসিত আধা কলোনগুলি থেকে মুক্তি পান :)
মোবাইলমনে

8
আমি সেমিকোলন পছন্দ করি। কোডগুলি কম অস্পষ্ট করে তোলে, বিশেষত যারা হাস্যকরভাবে ভার্বোজ কোকো / কোকো-টাচ এপিআই নাম এবং স্বাক্ষর নিয়ে। তাদের আইএমএইচও অপসারণের জন্য সুইফ্ট ডিজাইনারদের কাছ থেকে খারাপ সিদ্ধান্ত।
ব্যাডমিন্টনকিট

25
আইএমএইচও, আপনি যদি কোনও চরিত্র টাইপ করেন এবং এটি সংকলিত বাইনারিটিকে প্রভাবিত করে না, আপনার এটি টাইপ করা উচিত নয় :)
স্যাম সোফেস

33
@ সামসফসস যাতে আপনি মোটেও (অতিরিক্ত) সাদা স্থান ব্যবহার করেন না? এবং আপনি সমস্ত চিহ্নকে একক অক্ষর হিসাবে নিবিড় করে তোলেন?
ভিক্টর জ্যালেনকাস

8
এই আলোচনাটি আমাকে সিলিকন ভ্যালি
অ্যারন

14

আরও জেনেরিক ইউআইভিউউকন্ট্রোলারের জন্য আপনি এটি সুইফট ২.০ হিসাবে ব্যবহার করতে পারেন

init() {
    super.init(nibName: nil, bundle: nil)
}

11

আপনি এটি সম্পূর্ণরূপে সমাধান করতে সক্ষম হয়েছেন কিনা তা নিশ্চিত নন ... তবে আপনি কীভাবে আপনার শ্রেণীর ইন্টারফেসটি দেখতে চান এবং আপনার কোডার কার্যকারিতাটি প্রয়োজন কিনা তা নির্ভর করে আপনি নীচেরটিও ব্যবহার করতে পারেন:

convenience required init(coder aDecoder: NSCoder)
{
    //set some defaults for leftVC, rightVC, and gap
    self.init(leftVC, rightVC, gap)
}

যেহেতু init:leftVC:rightVC:gapএকটি মনোনীত ইনিশিয়ালাইজার তাই আপনি প্রয়োগের প্রয়োজনীয়তা পূরণ করতে পারেনinit:coder এটিকে একটি প্রারম্ভিক প্রাথমিকক হিসাবে পরিচিত করে যা আপনার মনোনীত আরম্ভকারীকে কল করে ।

এটি এর চেয়ে ভাল হতে পারে

override init(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder);
}

কারণ আপনার যদি কিছু বৈশিষ্ট্য সূচনা করতে হয় তবে আপনাকে সেগুলি পুনরায় লেখার প্রয়োজন হবে।


8

সুইফট 5

আপনি যদি কাস্টম ইনিশিয়ালাইজার লিখতে চান UIViewControllerযা দিয়ে শুরু করা হয়storyBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")

আপনি কেবল Optionalবৈশিষ্ট্যের জন্য কাস্টম ইনিশিয়ালাইজার লিখতে পারেন ।

class MyFooClass: UIViewController {
    var foo: Foo?

    init(with foo: Foo) {
        self.foo = foo
        super.init(nibName: nil, bundle: nil)
    }

    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.foo = nil
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.