মারাত্মক ত্রুটি: ক্লাসের জন্য অল্পবিস্তর ইনিশিয়ালাইজার 'থ্রি (কোডার :)' ব্যবহার


156

আমি সুইফটের সাথে আমার অবশিষ্ট প্রকল্পটি চালিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি। আমি যখন UIViewcontrollerআমার স্টোরিবোর্ডের ভিউ কন্ট্রোলারে কাস্টম ক্লাস (সাবক্লাস ) যুক্ত করি এবং প্রকল্পটি লোড করি, অ্যাপটি হঠাৎ নিম্নলিখিত ত্রুটির সাথে ক্র্যাশ হয়ে গেছে:

মারাত্মক ত্রুটি: ক্লাসের জন্য অল্পবিস্তর ইনিশিয়ালাইজার 'থ্রি (কোডার :)' ব্যবহার

এটি একটি কোড:

import UIKit

class TestViewController: UIViewController {

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    override func viewDidLoad() {
        super.viewDidLoad()
              // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
    // #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
}

কিছু প্রস্তাব দিন

উত্তর:


207

সমস্যা

এই সূচনাকারী অভাবে সৃষ্টি হয় init?(coder aDecoder: NSCoder)লক্ষ্যে UIViewController। এই পদ্ধতিটি প্রয়োজনীয় কারণ এটি কল UIViewControllerথেকে কোনও ইনস্ট্যান্ট UIStoryboardকরে।

আমরা কীভাবে একটি UIViewControllerথেকে কীভাবে সূচনা করি তা দেখার জন্য UIStoryboardদয়া করে এখানে একবার দেখুন

কেন এটি উদ্দেশ্যমূলক-সি নিয়ে সমস্যা নয়?

কারণ অবজেক্টিভ-সি স্বয়ংক্রিয়ভাবে সমস্ত প্রয়োজনীয় UIViewControllerপ্রারম্ভিককে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

সুইফট স্বয়ংক্রিয়ভাবে আরম্ভকারীদের উত্তরাধিকারী হয় না কেন?

সুরক্ষার কারণে ডিফল্টরূপে সুইফ্ট আরম্ভকারীদের উত্তরাধিকারী হয় না। তবে এটি যদি সমস্ত বৈশিষ্ট্যের একটি মান (বা optionচ্ছিক) থাকে এবং সাবক্লাস কোনও নির্ধারিত আরম্ভকারীকে সংজ্ঞায়িত না করে তবে এটি সুপারক্লাস থেকে সমস্ত প্রারম্ভিককে উত্তরাধিকারী করবে।


সমাধান

1. প্রথম পদ্ধতি

ম্যানুয়ালি init?(coder aDecoder: NSCoder)টার্গেট বাস্তবায়নUIViewController

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

2. দ্বিতীয় পদ্ধতি

সরানো হচ্ছে init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)আপনার টার্গেট উপর UIViewControllerযেমন সুপারক্লাস থেকে প্রয়োজনীয় initializers সব উত্তরাধিকারী হবে ডেভ উড তার উপর নির্দিষ্ট উত্তর নিচে



4
এর জন্য ধন্যবাদ. দ্রুত ফলোআপ ... আপনি যখন টেবিলভিউ নিয়ন্ত্রণকারী ফাইলটি তৈরি করবেন তখন এক্সকোডে ইতিমধ্যে অন্তর্ভুক্ত রয়েছে init(style: UITableViewStyle) { super.init(style: style) // Custom initialization } কেন আমরা দুটি টি ডি ফাংশন রাখতে পারি? এবং কোনও ধারণা কেন অ্যাপল ডিফল্টরূপে ২ য় সূচনা অন্তর্ভুক্ত করে না?
ট্রেভর ম্যাককেন্দ্রিক

আইওএস 7 বা আইওএস 8 এর সাথে এর কোনও যোগসূত্র নেই 8 যা সুইফট ইনটিটিয়ালাইজারদের উত্তরাধিকার সূত্রে পায় এর সাথে এটি সংযুক্ত!
সুলতান

প্রকাশ্য Init (মতবাদ: UIViewController, ফ্রেম: CGRect) {self.viewController = দৃশ্য self.imageName = "" self.actionName = "" super.init (ফ্রেম: ফ্রেম)}
scrainie

প্রথম পদ্ধতিতে কাজ! আমার গতিশীল টেবিলটি শেষ পর্যন্ত গতিশীল কোষে ভরা !!! সমস্ত কারণ লাইনটি fatalError( "init(coder:) has not been implemented")আমার অ্যাপ্লিকেশনটি থামিয়ে দিয়েছে।
হোসে ম্যানুয়েল অ্যাবারকা রদ্রিগেজ

25

@ 3r1d এর সাথে অন্য একটি বিকল্প হ'ল পরিবর্তে আপনার ক্লাস থেকে নিম্নলিখিত টিআইডি পদ্ধতিটি সরানো:

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Custom initialization
}

সেই ডিআইডি পদ্ধতিটি সহ, উপ শ্রেণিকে init(coder aDecoder: NSCoder!)তার সুপার ক্লাস থেকে উত্তরাধিকার সূত্রে বাধা দেয় । এটি অন্তর্ভুক্ত না করে, আপনার শ্রেণি উভয়ের উত্তরাধিকারী হবে।

দ্রষ্টব্য: ডাব্লুডাব্লুডিসি 2014 সেশন 403 "ইন্টারমিডিয়েট সুইফ্ট" আরও তথ্যের জন্য প্রায় 33:50 চিহ্ন দেখুন।


সেশন 403-এ ব্যাখ্যাটি নির্দেশ করার জন্য ধন্যবাদ। তবে যদি শিশু শ্রেণিতে কেবল সুবিধাপ্রাপ্তি থাকে তবে তা উত্তম শ্রেণীর প্রারম্ভিকদের অধিকার পেতে পারে?
জামিল্টজ

1
হ্যাঁ. আপনি যদি নিজের নিজস্ব মনোনীত ডিআইডি পদ্ধতিগুলি (যাঁরা সুপার ইনটকে ডাকেন) সরবরাহ করে তবেই আপনি সুপার ক্লাসের ডিআইডি পদ্ধতি উত্তরাধিকার সূত্রে বাধা পেতে পারেন। তারপরে আপনাকে কোন সুপার ইনসাইটগুলি সমর্থন করতে হবে সেগুলি আপনার শ্রেণিতে যুক্ত করে এবং সুপার ভার্সনটি কল করতে হবে (@ 3r1d এর উত্তর হিসাবে)
ডেভ উড

আপনার শিশু শ্রেণিতে (মনোনীত) আরআইডি () ব্যতীত কেবল সুবিধাযুক্ত থিম () থাকা সংকলনের ত্রুটির কারণ হতে পারে। এটি কারণ সুবিধাপূর্ণ উদ্যোগ () ফাংশনটি অবশ্যই ফাংশন সংজ্ঞায়নের অভ্যন্তরে self.init () কল করতে পারে।
ওহমি

@narumolPug- এটি ভুল। আপনাকে মনোনীত initপদ্ধতি অন্তর্ভুক্ত করার দরকার নেই । আপনার শিশু শ্রেণি তাদের সুপার বর্গ থেকে উত্তরাধিকারী করবে। আপনি এখনও কল করতে পারেন self.init()যা সুপার সংস্করণটি কার্যকর করবে।
ডেভ উড

ভিডিওর সঠিক মুহূর্তটি এখানে পাওয়া যাবে youtu.be/W1s9ZjDkSN0?t=2030
মধু

10

দ্রুত UICollectionViewCellsসমস্যাযুক্ত লোকদের জন্য , @ 3r1d আপনার কাস্টম UICollectionViewCellক্লাসে পরামর্শ দেওয়া কোডটি দেখুন নিয়ন্ত্রককে নয়:

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}

আপনি কোন ইউআইসিএল্লেশনভিউসেলকে উল্লেখ করছেন? কোডার সহ উদ্যোগটি ভিউ কন্ট্রোলারটি শুরু করার উপায়
ই-রিদ্দি

এই উদাহরণে নয় তবে যদি কারওর সাথে এটির সমস্যা হয় (আমি করেছি) ... আপনি যদি নিজের কাস্টম সেলটিতে একটি ইউআইসিএল্লেশনভিউকন্ট্রোলার ব্যবহার করার চেষ্টা করেন তবে সুইড ফাইলটিতে আপনার কোডারের সাহায্যে উদ্যোগ নেওয়া উচিত।
নিক ইয়াপ

2
এই কোডটি সব আপনি ইনস্ট্যান্স এই পদ্ধতি ব্যবহার যোগ করতে হবে stackoverflow.com/questions/24035984/...
ই-Riddie

3

যারা সুইফটে কোডের প্রয়োজন তাদের জন্য:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

[সম্পাদনা] এটি ছিল সুইফটের পুরানো সংস্করণ। সম্ভবত আর কাজ করে না।


3

একটি প্রোগ্রামেটিক কালেকশন ভিউ সেলটিতে আমার এই সমস্যাটি ছিল এবং অপ্স কোনও ভিসি সম্পর্কে জিজ্ঞাসা করলেও উত্তর সন্ধানের সময় আমি এখনও এই প্রশ্নটিতে অবতরণ করেছি। আমার জন্য বিষয়টি আমার কাছে ছিল

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

কার্যকর করা হয়েছে যাতে শীর্ষের উত্তর কাজ করে না। আমার কাছে সেলে যা ছিল না তা ছিল আরম্ভকারী:

// my programmatic cell was missing this
override init(frame: CGRect) {
    super.init(frame: frame)
}

একবার এটি যুক্ত করলে ত্রুটিটি চলে যায়


1

অভ্যন্তরীণ প্রক্রিয়াটিকে সূক্ষ্মভাবে তৈরি করার জন্য কিছু পদ্ধতি যুক্ত করার পরিবর্তে, আমি আমার বৈশিষ্ট্যগুলি @ লাজি হিসাবে সংজ্ঞায়িত করতে এবং শ্রেণীর ক্ষেত্রের মধ্যে তাদের সূচনা করতে শুরু করব।


আপনি আপনার সম্পত্তি viaচ্ছিক হিসাবে ঘোষণা করতে পারে ?
জুলিয়ান বি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.