আমি সুইফটে ইউআইভিউউকন্ট্রোলারে ডিফল্ট সুপারিনাইটকে () কেন কল করতে পারি না?


85

আমি UIViewControllerস্টোরিবোর্ড থেকে একটি ব্যবহার করছি না এবং আমি একটি কাস্টম initফাংশন রাখতে চাই যেখানে আমি NSManagedObjectIDকোনও অবজেক্টে পাস করি । আমি super.init()যেমন আমার উদ্দেশ্য ও সি আছে তেমন কল করতে চাই। এটার মত:

init(objectId: NSManagedObjectID) {
    super.init()
}

তবে আমি নিম্নলিখিত সংকলক ত্রুটি পেয়েছি:

সুপারক্লাস ইউআইভিউউকন্ট্রোলারের মনোনীত প্রারম্ভিককে অবশ্যই কল করতে হবে

আমি কি আর এই কাজটি করতে পারি না?

উত্তর:


121

জন্য মনোনীত initialiser UIViewControllerহয় initWithNibName:bundle:। পরিবর্তে আপনি এটি কল করা উচিত।

Http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-uiviewcontroller/ দেখুন

আপনার যদি নিব না থাকে nilতবে নিবনেমের জন্য প্রবেশ করুন (বান্ডিলটিও alচ্ছিক)। তারপর আপনি একটি কাস্টম দৃশ্য নির্মাণ পারে loadViewবা subviews যোগ করে self.viewviewDidLoadএকই হিসাবে আপনি করতেন।


4
সুতরাং বর্তমানে কোনও ইউআইভিউকন্ট্রোলার সাবক্লাসে কাস্টম ডিআইডি পদ্ধতি তৈরি করা আমার পক্ষে অসম্ভব যা নিব থেকে আসে না?
সিররুপ্টিআইআইআই

4
আহ, ধন্যবাদ !! আমি নিব নামের জন্য "" দিয়ে যাচ্ছিলাম।
সিররুপ্টিআইআইআই

4
ওহ, কিছুটা খনন করার পরে, এটি প্রোটোকল initWithCoder:থেকে আসে NSCoding... আমি ইউআইভিউকন্ট্রোলার উদাহরণটি শুরু করার ক্ষেত্রে এর ভূমিকা কী তা এখনও বুঝতে পারি না, এটি ইউআইভিউউকন্ট্রোলারের কোনও "মনোনীত" ইনিশিয়ালাইজার কিনা বা এর সুপারক্লাসগুলির কোনও ... ।
নিকোলাস মিয়ারি

6
ধন্যবাদ! দ্রুত কপি জন্য / শুধু আপনার নির্ধারণের পরে এই কল পেস্ট letবৈশিষ্ট্য, যদি থাকে: super.init(nibName: nil, bundle: nil)
ফেরান মেলিনচ

4
ইনার উইথ কোডার যখন আপনার রাজ্য পুনরুদ্ধার করার প্রয়োজন হয় তখন জন্য ব্যবহৃত হয়। আপনি যখন রাজ্য পুনরুদ্ধার কার্যকারিতা ব্যবহার করে ভিউকন্ট্রোলারের রাজ্যটি সংরক্ষণ করেন, রাষ্ট্র যখন সংরক্ষণ করা হয়েছিল তখন কোডার আপনার যে মানগুলি সংরক্ষণ করেছিল তা ফিরিয়ে দেবে। আপনি যখন অ্যাপ্লিকেশনটি বন্ধ করে দিয়েছেন সেখান থেকে আপনি ভিউ কন্ট্রোলারটিকে তার শেষ প্রাথমিক অবস্থায় পুনর্নির্মাণ করতে পারেন। সুতরাং ব্যবহারকারীরা যেখানে সেখান থেকে চলে গিয়েছিল
Esko918

44

আর একটি দুর্দান্ত সমাধান হ'ল আপনার নতুন ইনিশিয়ালাইজারটিকে convenienceইনিশিয়ালাইজার হিসাবে নিম্নরূপে ঘোষণা করা:

convenience init( objectId : NSManagedObjectID ) {
    self.init()

    // ... store or user your objectId
}

আপনি যদি আপনার সাবক্লাসে কোনও মনোনীত আরম্ভকারী ঘোষণা না করে থাকেন তবে সেগুলি স্বয়ংক্রিয়ভাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং আপনি self.init()আপনার সুবিধার্থ প্রাথমিকের মধ্যে ব্যবহার করতে সক্ষম হন ।

UIViewController ক্ষেত্রে ডিফল্ট Init পদ্ধতি ডাকব init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)সঙ্গে nilউভয় আর্গুমেন্টগুলি (UIViewController উপর কমান্ড ক্লিক করুন আপনি যে তথ্য দিতে হবে) জন্য।

টিএল; টিআর : আপনি যদি প্রোগ্রামটিমেটিকভাবে UIViewControllerএখানে কাজ করতে পছন্দ করেন তবে একটি সম্পূর্ণ কার্যকারী উদাহরণ যা একটি কাস্টম আর্গুমেন্ট সহ একটি নতুন আরম্ভকারী যুক্ত করে:

class MyCustomViewController: UIViewController {
    var myString: String = ""

    convenience init( myString: String ) {
        self.init()

        self.myString = myString
    }
}

এটি একটি আরও মার্জিত সমাধান এবং যে কোনও জেনেরিক ক্ষেত্রে কাজ করে
Ciprian

4
আমি এটি একটি এক্সটেনশনে করার চেষ্টা করেছি এবং এটি পুনরাবৃত্তভাবে নিজেকে বলে।
দানিয়াল আয়টেকিন

12
এই উত্তরের "কৌশল" myStringএটি সেট করা আছে ""যাতে initএটির প্রয়োজন হয় না। আপনি যদি প্রাথমিক মানটি ব্যবহার করতে না চান তবে এই সমাধানটি পৃথক হয়ে যায় এবং সেই ক্ষেত্রে আপনাকে ব্যবহারের প্রয়োজনself.init(nibName: nil, bundle:nil)
ড্যান রোজনস্টার্ক

4
@ ইয়ার বা আপনি myStringসম্পত্তিটি একটি alচ্ছিক করুন
ক্লাস

4
@ ক্লাস হ্যাঁ: আমার সমস্যাটি হ'ল আমি বিকল্পগুলি এড়াতে এবং আমার কোডটি সংকলিত করার জন্য কেবলমাত্র প্রারম্ভিক ব্যবহার করছি।
ড্যান রোজনস্টার্ক


16

আপডেট: লিঙ্ক যুক্ত করুন

https://developer.apple.com/docamentation/uikit/uiviewcontroller/1621359-init

IOS এর জন্য ডকুমেন্টেশন মতে, UIViewController জন্য মনোনীত initialiser হয় initWithNibName: bundle:

আপনি যদি ইউআইভিউউকন্ট্রোলার সাবক্লাস করেন তবে আপনাকে অবশ্যই এনআইবি ব্যবহার না করা সত্ত্বেও আপনাকে অবশ্যই এই পদ্ধতির সুপার প্রয়োগ করতে হবে।

আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

init(objectId : NSManagedObjectID) {

    super.init(nibName: (xib's name or nil'), bundle: nil)

   // other code...
}

বা

সুবিধাপ্রাপ্তি হিসাবে একটি নতুন ইনিশিয়ালাইজার ঘোষণা করুন:

 convenience init( objectId : NSManagedObjectID ) {

    self.init()

     // other code...

}


4
আপনার এটিকে স্ক্রিনক্যাপ হিসাবে না রেখে, অ্যাট্রিবিউশনের জন্য মূলটির সাথে লিঙ্ক করা উচিত।
নাথান টগি

আমি @ এনসিএনসি যেমন বলেছিলাম তেমন প্রক্রিয়া ব্যবহার করেছি। এটা আমার জন্য কাজ করেছে। এখানে লিঙ্কটি
অনিল গুপ্ত

@ নাথনটগি না, তাঁর উচিত নয়। লিঙ্কগুলির মেয়াদ শেষ হওয়ার বা কোনও দিন সরানোর বৈশিষ্ট্য রয়েছে। যে তথ্য সে খুঁজছে তার পরিবর্তে 404 ত্রুটি দেখতে চায় কে?
মাইকোলেজ

4
@ মাইকোলজ: এই উত্তরটি ইতিমধ্যে এখানে তথ্য রয়েছে । (অন্যথায় আমি লিঙ্ক-কেবল উত্তর হিসাবে মুছে ফেলার জন্য ফ্ল্যাগিং করতাম)) তবে এ্যাট্রিবিউশনটিও গুরুত্বপূর্ণ তাই যাতে যে কেউ এটি পড়তে পারে সে এটি কোথা থেকে এসেছে তা জানতে এবং সেগুলি জমা দিতে পারে। একটি স্ক্রিনশট তার জন্য কাজ করে না, তবে একটি লিঙ্ক কাজ করে। যদি কোনও লিঙ্ক দণ্ডিত হয়, তবে এটি দুর্ভাগ্যজনক, তবে আপনি সম্ভবত আমাকে বলতে পারবেন না যে কোনও ধরণের creditণ না দেওয়ার চেয়েও খারাপ পরিস্থিতি। আপত্তি আপত্তি লিঙ্ক করতে হয় - উত্তর উত্তর লিঙ্ক শুধুমাত্র উত্তর। লিঙ্কগুলিতে নয়। লিঙ্ক এবং তথ্য হ'ল কাঙ্ক্ষিত সূত্র।
নাথান টগি

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