স্টোরিবোর্ডে ইন্টারফেস সেটআপ সহ সুইট-এ ইউআইভিউউকন্ট্রোলারের জন্য কাস্টম আরএস


89

আমি ইউআইভিউকন্ট্রোলারের সাবক্লাসের জন্য কাস্টম ডিআইডি লেখার জন্য সমস্যা বোধ করছি, মূলত আমি সম্পত্তি পছন্দ হিসাবে সরাসরি স্থাপনের চেয়ে ভিউকন্ট্রোলারের জন্য init পদ্ধতির মাধ্যমে নির্ভরতাটি পাস করতে চাই want viewControllerB.property = value

তাই আমি আমার ভিউকন্ট্রোলারের জন্য একটি কাস্টম ডিআই তৈরি করেছিলাম এবং সুপার ডিজাইনেড ডিএম কল করি

init(meme: Meme?) {
        self.meme = meme
        super.init(nibName: nil, bundle: nil)
    }

ভিউ কন্ট্রোলার ইন্টারফেসটি স্টোরিবোর্ডে থাকে, আমি কাস্টম ক্লাসের জন্য আমার ভিউ নিয়ন্ত্রক হওয়ার জন্য ইন্টারফেসও তৈরি করেছি। আপনি যদি এই পদ্ধতির মধ্যে কিছু না করেও সুইফ্টকে এই ডিআইডি পদ্ধতিটি কল করতে হবে। অন্যথায় সংকলক অভিযোগ করবে ...

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

সমস্যাটি তখন যখন আমি আমার কাস্টম MyViewController(meme: meme)টিআইএমকে কল করার চেষ্টা করি এটির সাথে আমার ভিউকন্ট্রোলারের কোনও বৈশিষ্ট্যই আরম্ভ করা হয় না ...

আমি ডিবাগ করার চেষ্টা করছিলাম, আমি আমার ভিউকন্ট্রোলারে খুঁজে পেয়েছি, init(coder aDecoder: NSCoder)প্রথমে কল করুন, তারপরে আমার কাস্টম ডিআই পরে কল করা হবে। তবে এই দুটি init পদ্ধতি বিভিন্ন selfমেমরি ঠিকানা ফেরত দেয় ।

আমি আমার viewController জন্য Init সঙ্গে কিছু ভুল ধারণা করছি, এবং এটা সবসময় ফিরে আসবে selfসঙ্গে init?(coder aDecoder: NSCoder), যা, কোন প্রয়োগ করা হয়েছে।

আপনার ভিউকন্ট্রোলারের জন্য কীভাবে কাস্টম ডিআইএম তৈরি করতে হয় তা কি কেউ জানেন? দ্রষ্টব্য: আমার ভিউকন্ট্রোলারের ইন্টারফেসটি স্টোরিবোর্ডে সেট আপ হয়েছে

এখানে আমার ভিউ নিয়ন্ত্রণকারী কোড:

class MemeDetailVC : UIViewController {

    var meme : Meme!

    @IBOutlet weak var editedImage: UIImageView!

    // TODO: incorrect init
    init(meme: Meme?) {
        self.meme = meme
        super.init(nibName: nil, bundle: nil)
    }

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

    override func viewDidLoad() {
        /// setup nav title
        title = "Detail Meme"

        super.viewDidLoad()
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        editedImage = UIImageView(image: meme.editedImage)
    }

}

আপনি কি এর জন্য একটি সমাধান পেয়েছেন?
ব্যবহারকারী 481610

উত্তর:


50

এটি উপরের উত্তরের যে কোনও একটিতে উল্লিখিত ছিল আপনি কাস্টম আর ডি পদ্ধতি এবং স্টোরিবোর্ড উভয়ই ব্যবহার করতে পারবেন না।

তবে আপনি এখনও ViewControllerস্টোরিবোর্ড থেকে ইনস্ট্যান্ট করতে এবং এটিতে অতিরিক্ত সেটআপ করতে স্ট্যাটিক পদ্ধতি ব্যবহার করতে পারেন ।

এটি দেখতে এটির মতো হবে:

class MemeDetailVC : UIViewController {
    
    var meme : Meme!
    
    static func makeMemeDetailVC(meme: Meme) -> MemeDetailVC {
        let newViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "IdentifierOfYouViewController") as! MemeDetailVC
        
        newViewController.meme = meme
        
        return newViewController
    }
}

আপনার স্টোরিবোর্ডে প্রদর্শক নিয়ন্ত্রক সনাক্তকারী হিসাবে আইডেন্টিফায়ারঅফ ইউভিউকন্ট্রোলার নির্দিষ্ট করতে ভুলবেন না। উপরের কোডে আপনার স্টোরিবোর্ডের নামও পরিবর্তন করতে হবে।


মেমডেটেলভিসি শুরু করার পরে, সম্পত্তি "মেম" বিদ্যমান রয়েছে। তারপরে নির্ভরতা ইনজেকশনটি "মেম" এর মান নির্ধারণ করতে আসে। এই মুহুর্তে, লোডভিউ () এবং ভিউডিডলড কল করা হয়নি। এই দুটি পদ্ধতি মেমডেটেলভিসি যোগ করার পরে শ্রেণিবদ্ধতা দেখার জন্য ডাকা হবে।
জিম ইউ

এখানে সেরা উত্তর!
পাসক্যালস

তবুও ডিআইডি পদ্ধতিটি প্রয়োজনীয়, এবং সংকলক বলবেন মেমের সঞ্চিত সম্পত্তি আরম্ভ করা হয়নি
সুরেন্দ্র কুমার

27

স্টোরিবোর্ড থেকে আরম্ভ করার সময় আপনি কাস্টম ইনিশিয়ালাইজারটি ব্যবহার করতে পারবেন না, init?(coder aDecoder: NSCoder)অ্যাপল কীভাবে কোনও স্ট্রোলবোর্ডাকে কন্ট্রোলার সূচনা করার জন্য ডিজাইন করেছিল তা ব্যবহার করে । তবে, এ-তে ডেটা প্রেরণের উপায় রয়েছে UIViewController

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

override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "identifier" {
        if let controller = segue.destinationViewController as? MemeDetailVC {
            controller.meme = "Meme"
        }
    }
}

আমি পরীক্ষার উদ্দেশ্যে Stringপরিবর্তে প্রকারের একটি সম্পত্তি ব্যবহার করেছি Meme। এছাড়াও, নিশ্চিত হয়ে নিন যে আপনি সঠিক সেগু শনাক্তকারীকে ( "identifier"কেবল একটি স্থানধারক ছিলেন) পাস করেছেন ।


4
হাই, তবে কীভাবে আমরা optionচ্ছিক হিসাবে সুনির্দিষ্টকরণ থেকে মুক্তি পেতে পারি এবং এটি নির্ধারণ না করার ক্ষেত্রেও আমরা ভুল করতে চাই না। আমরা কেবল কন্ট্রোলারের পক্ষে প্রথম স্থানে থাকার জন্য কঠোর নির্ভরশীলতা অর্থবহ করতে চাই।
অ্যাম্বার কে

4
@ অ্যাম্বার্ক আপনি ইন্টারফেস বিল্ডার ব্যবহার না করে আপনার ইন্টারফেস প্রোগ্রামিংয়ের দিকে নজর রাখতে পারেন।
কালেব ক্লেভেটার

ঠিক আছে, আমি খুব রেফারেন্সের জন্য কিকস্টার্টার আইওএস প্রোজেক্টটিও খুঁজছি, তারা কীভাবে তাদের দর্শন মডেলগুলি প্রেরণ করে তা এখনও বলতে পারছি না।
অ্যাম্বার কে

23

@ কালেব ক্লেভেটার উল্লেখ করেছেন যে, স্টোরিবোর্ড থেকে আরম্ভ করার সময় আমরা কোনও কাস্টম ইনিশিয়ালাইজার ব্যবহার করতে পারি না।

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

দ্রষ্টব্য: এটি সমস্যার সমাধানের জন্য প্রশ্নের পরিবর্তে কোনও সঠিক উত্তর নয়।

মেমডেটেলভিসি ক্লাসে, ক্লাস পদ্ধতি তৈরি করুন:

// Considering your view controller resides in Main.storyboard and it's identifier is set to "MemeDetailVC"
class func `init`(meme: Meme) -> MemeDetailVC? {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "MemeDetailVC") as? MemeDetailVC
    vc?.meme = meme
    return vc
}

ব্যবহার:

let memeDetailVC = MemeDetailVC.init(meme: Meme())

4
তবে এখনও অপূর্ণতা রয়েছে, সম্পত্তিটি alচ্ছিক হতে হবে।
আম্বার কে

যখন ব্যবহার class func Init (meme: Meme) -> MemeDetailVCXcode 10.2 বিভ্রান্ত এবং ত্রুটি দেয়Incorrect argument label in call (have 'meme:', expected 'coder:')
স্যামুয়েল

21

এটি করার একটি উপায় হ'ল সুবিধামুখী আরম্ভকারী with

class MemeDetailVC : UIViewController {

    convenience init(meme: Meme) {
        self.init()
        self.meme = meme
    }
}

তারপরে আপনি আপনার MemeDetailVC এর সাথে আরম্ভ করবেন let memeDetailVC = MemeDetailVC(theMeme)

প্রারম্ভিকগুলির উপর অ্যাপলের ডকুমেন্টেশনটি বেশ ভাল, তবে আমার ব্যক্তিগত প্রিয় রে রেন্ডারলিচ: ডিপথ টিউটোরিয়াল সিরিজের সূচনা যা আপনাকে বিভিন্ন ধরণের বিকল্প বিকল্প এবং জিনিসগুলি করার "সঠিক" উপায় সম্পর্কে প্রচুর ব্যাখ্যা / উদাহরণ দেয় give


সম্পাদনা : আপনি কাস্টম ভিউ কন্ট্রোলারগুলিতে সুবিধাপূর্ণ আরম্ভকারী ব্যবহার করতে পারবেন, সকলেই এই বক্তৃতায় সঠিক যে স্টোরিবোর্ড থেকে শুরু করে বা স্টোরিবোর্ড সেগের মাধ্যমে আপনি কাস্টম আরম্ভকারী ব্যবহার করতে পারবেন না।

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

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


4
আমি এটি পাই না, যদি আমার ইন্টারফেসটি স্টোরিবোর্ডে সেটআপ হয় এবং হ্যাঁ আমি এটি প্রোগ্রামগতভাবে তৈরি করছি, তবে আমাকে ইন্টারফেসটি লোড করার জন্য স্টোরিবোর্ড ব্যবহার করে তাত্ক্ষণিক পদ্ধতিটি কল করতে হবে? কিভাবে convenienceএখানে সাহায্য হয়।
অ্যাম্বার কে

ক্লাসের অন্য একটি initফাংশন (স্ট্র্টগুলি যদিও পারে) কল করে দ্রুততম শ্রেণিগুলি আরম্ভ করা যায় না । কল করার জন্য self.init(), আপনাকে অবশ্যই init(meme: Meme)একটি convenienceআরম্ভকারী হিসাবে চিহ্নিত করতে হবে । অন্যথায়, আপনাকে ম্যানুয়ালি নিজেই UIViewControllerপ্রারম্ভিকের মধ্যে সমস্ত প্রয়োজনীয় বৈশিষ্ট্যগুলি নির্ধারণ করতে হবে এবং এই সমস্ত বৈশিষ্ট্য কী তা আমি নিশ্চিত নই।
পনিবয় 47৪

এটি তখন ইউআইভিউউকন্ট্রোলারকে সাবক্লাসিং করছে না, কারণ আপনি সেলফিনিয়েট () কল করছেন এবং সুপারইনাইট () নয়। আপনি এখনও মেমডেটেলভিসিকে ডিফল্ট থেমে থের মতো ব্যবহার করে আরম্ভ করতে পারেন MemeDetail()এবং সেক্ষেত্রে কোডটি ক্র্যাশ হয়ে যাবে
আলী

এটি এখনও সাবক্লাসিং হিসাবে বিবেচনা করা হয় কারণ স্বীকৃতিতে () এটি প্রয়োগের ক্ষেত্রে সুপার.ইনাইট () কল করতে হবে বা সেলফিনিয়েট () সম্ভবত পিতামাতার কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে যে ক্ষেত্রে তারা কার্যত সমতুল্য।
পনিবয় 47

6

মূলত এখানে বেশ কয়েকটি উত্তর ছিল, যা গরুকে ভোট দেওয়া হয়েছিল এবং সেগুলি মূলত সঠিক থাকলেও মুছে ফেলা হয়েছিল। উত্তর, আপনি পারবেন না।

স্টোরিবোর্ড সংজ্ঞা থেকে কাজ করার সময় আপনার দর্শন নিয়ন্ত্রক দৃষ্টান্তগুলি সমস্ত সংরক্ষণাগারভুক্ত হয়। সুতরাং, তাদের আরম্ভ করার জন্য এটি init?(coder...ব্যবহার করা প্রয়োজন । দ্যcoderযেখানে সব সেটিংস / দৃশ্য তথ্য থেকে আসে।

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

সমস্ত ক্ষেত্রে আপনি এসডিকে প্রয়োজনীয় ডিআইআর ফাংশন ব্যবহার করেন এবং পরে অতিরিক্ত পরামিতিগুলি পাস করেন।


4

সুইফট 5

আপনি এর মতো কাস্টম ইনিশিয়ালাইজার লিখতে পারেন ->

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
    }
}

3

UIViewControllerশ্রেণি NSCodingপ্রোটোকল অনুসারে যা সংজ্ঞায়িত হয়:

public protocol NSCoding {

   public func encode(with aCoder: NSCoder)

   public init?(coder aDecoder: NSCoder) // NS_DESIGNATED_INITIALIZER
}    

সুতরাং UIViewControllerদুটি মনোনীত প্রাথমিক init?(coder aDecoder: NSCoder)এবং আছে init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)

স্টোরিবোর্ড init?(coder aDecoder: NSCoder)সরাসরি আরম্ভের জন্য কল করে UIViewControllerএবং UIView, আপনার পরামিতিগুলি পাস করার কোনও জায়গা নেই।

অস্থায়ী ক্যাশে ব্যবহার করা একটি জটিল কাজ:

class TempCache{
   static let sharedInstance = TempCache()

   var meme: Meme?
}

TempCache.sharedInstance.meme = meme // call this before init your ViewController    

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder);
    self.meme = TempCache.sharedInstance.meme
}

2

আইওএস 13 হিসাবে আপনি উদাহরণস্বরূপ : instantiateViewController(identifier:creator:)পদ্ধতিটি ব্যবহার করে স্টোরিবোর্ডে থাকা ভিউ কন্ট্রোলারটিকে আরম্ভ করতে পারেন UIStoryboard

টিউটোরিয়াল: https://sarunw.com/posts/better-d dependency-inication-for-storyboards-in- ios13/


1

সঠিক প্রবাহ হ'ল, মনোনীত ইনিশিয়ালাইজারকে কল করুন যা এক্ষেত্রে নিবনামের সাথে আরম্ভ করে,

init(tap: UITapGestureRecognizer)
{
    // Initialise the variables here


    // Call the designated init of ViewController
    super.init(nibName: nil, bundle: nil)

    // Call your Viewcontroller custom methods here

}

0

দাবি অস্বীকার: আমি এর পক্ষে আইনজীবী করি না এবং এর স্থিতিস্থাপকতার পুরোপুরি পরীক্ষাও করি নি, তবে এটি আশেপাশে খেলতে গিয়ে আবিষ্কার করা একটি সম্ভাব্য সমাধান।

প্রযুক্তিগতভাবে, স্ট্যান্ডবোর্ড-কনফিগার করা ইন্টারফেস সংরক্ষণের সময় দুটি বারে ভিউ কন্ট্রোলারটিকে আরম্ভ করার মাধ্যমে কাস্টম সূচনা অর্জন করা যেতে পারে: আপনার কাস্টমের মাধ্যমে প্রথমবার initএবং দ্বিতীয় বার loadView()যেখানে স্টোরিবোর্ড থেকে আপনি দৃষ্টি নিবদ্ধ রাখবেন।

final class CustomViewController: UIViewController {
  @IBOutlet private weak var label: UILabel!
  @IBOutlet private weak var textField: UITextField!

  private let foo: Foo!

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

  override func loadView() {
    //Only proceed if we are not the storyboard instance
    guard self.nibName == nil else { return super.loadView() }

    //Initialize from storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let storyboardInstance = storyboard.instantiateViewController(withIdentifier: "CustomVC") as! CustomViewController

    //Remove view from storyboard instance before assigning to us
    let storyboardView = storyboardInstance.view
    storyboardInstance.view.removeFromSuperview()
    storyboardInstance.view = nil
    self.view = storyboardView

    //Receive outlet references from storyboard instance
    self.label = storyboardInstance.label
    self.textField = storyboardInstance.textField
  }

  required init?(coder: NSCoder) {
    //Must set all properties intended for custom init to nil here (or make them `var`s)
    self.foo = nil
    //Storyboard initialization requires the super implementation
    super.init(coder: coder)
  }
}

আপনার অ্যাপ্লিকেশানের অন্য কোথাও আপনি নিজের কাস্টম প্রারম্ভককে কল করতে পারেন CustomViewController(someParameter: foo)এবং স্টোরিবোর্ড থেকে দেখুন কনফিগারেশনটি এখনও পেতে পারেন।

আমি বেশ কয়েকটি কারণে এটিকে একটি দুর্দান্ত সমাধান হিসাবে বিবেচনা করি না:

  • অবজেক্ট ইনিশিয়ালাইজেশনটি কোনও প্রাক-প্রাথমিক বৈশিষ্ট্য সহ ডুপ্লিকেট করা হয়েছে
  • কাস্টমতে পাস হওয়া প্যারামিটারগুলি initঅবশ্যই alচ্ছিক বৈশিষ্ট্য হিসাবে সংরক্ষণ করতে হবে
  • বয়লারপ্লেট যুক্ত করে যা অবশ্যই আউটলেট / বৈশিষ্ট্য পরিবর্তিত হওয়ার কারণে বজায় রাখতে হবে

সম্ভবত আপনি এই ট্রেড অফগুলি গ্রহণ করতে পারেন তবে নিজের ঝুঁকিতে ব্যবহার করুন


0

যদিও আমরা এখন স্টোরিবোর্ডে ডিফল্ট কন্ট্রোলারদের ব্যবহার instantiateInitialViewController(creator:)এবং সম্পর্ক এবং শো সহ বিভাগগুলির জন্য কাস্টম ডিআই করতে পারি ।

এই ক্ষমতাটি এক্সকোড 11 এ যুক্ত করা হয়েছে এবং নিম্নলিখিতটি এক্সকোড 11 রিলিজ নোটের একটি অংশ :

নতুন @IBSegueActionবৈশিষ্ট্যের সাহায্যে বর্ণিত একটি ভিউ কন্ট্রোলার পদ্ধতি কোনও প্রয়োজনীয় মান সহ একটি কাস্টম ইনিশিয়ালাইজার ব্যবহার করে কোডে সিগের গন্তব্য দৃশ্য নিয়ন্ত্রণকারী তৈরি করতে ব্যবহার করা যেতে পারে। এটি স্টোরিবোর্ডগুলিতে অ-alচ্ছিক প্রারম্ভিককরণের প্রয়োজনীয়তা সহ দর্শন নিয়ন্ত্রকদের ব্যবহার সম্ভব করে তোলে। @IBSegueActionএর সোর্স ভিউ কন্ট্রোলারে একটি সেগমেন্ট থেকে কোনও পদ্ধতির সাথে সংযোগ তৈরি করুন । সেগু অ্যাকশনগুলিকে সমর্থন করে এমন নতুন ওএস সংস্করণে, সেই পদ্ধতিটি কল করা হবে এবং এটির মানটি সেগু destinationViewControllerঅবজেক্টের পাস হবে prepareForSegue:sender:। একাধিক @IBSegueActionপদ্ধতি একক উত্স দেখার নিয়ামককে সংজ্ঞায়িত করা যেতে পারে যা সেগু শনাক্তকারী স্ট্রিংগুলিতে চেক করার প্রয়োজনকে হ্রাস করতে পারেprepareForSegue:sender: । (47091566)

একটি IBSegueActionপদ্ধতিতে তিনটি পরামিতি লাগে: একটি কোডার, প্রেরক এবং সিগের সনাক্তকারী। প্রথম প্যারামিটারটি প্রয়োজনীয়, এবং অন্যান্য প্যারামিটারগুলি যদি আপনার পছন্দসই হয় তবে আপনার পদ্ধতির স্বাক্ষর থেকে বাদ দেওয়া যেতে পারে। NSCoderতা নিশ্চিত করার জন্য এটা স্টোরিবোর্ড কনফিগার মান কাস্টমাইজড গন্তব্য দৃশ্য নিয়ামক এর সূচনাকারী মাধ্যমে প্রেরণ করা আবশ্যক। পদ্ধতিটি এমন একটি দৃশ্যের নিয়ামককে ফেরত দেয় যা স্টোরিবোর্ডে সংজ্ঞায়িত গন্তব্য নিয়ন্ত্রকের সাথে মেলে, বা nilকোনও গন্তব্য নিয়ন্ত্রককে স্ট্যান্ডার্ড init(coder:)পদ্ধতির সাথে সূচনা করার জন্য । যদি আপনি জানেন যে আপনাকে ফিরতে হবে না nil, রিটার্নের ধরণটি অ-alচ্ছিক হতে পারে।

সুইফটে, @IBSegueActionগুণটি যুক্ত করুন :

@IBSegueAction
func makeDogController(coder: NSCoder, sender: Any?, segueIdentifier: String?) -> ViewController? {
    PetController(
        coder: coder,
        petName:  self.selectedPetName, type: .dog
    )
}

অবজেক্টিভ-সি তে, IBSegueActionরিটার্ন টাইপের সামনে যুক্ত করুন :

- (IBSegueAction ViewController *)makeDogController:(NSCoder *)coder
               sender:(id)sender
      segueIdentifier:(NSString *)segueIdentifier
{
   return [PetController initWithCoder:coder
                               petName:self.selectedPetName
                                  type:@"dog"];
}

-1

// ভিউ কন্ট্রোলার মেইন.স্টোরিবোর্ডে রয়েছে এবং এটিতে সনাক্তকারী সেট রয়েছে

ক্লাস বি

class func customInit(carType:String) -> BViewController 

{

let storyboard = UIStoryboard(name: "Main", bundle: nil)

let objClassB = storyboard.instantiateViewController(withIdentifier: "BViewController") as? BViewController

    print(carType)
    return objClassB!
}

শ্রেণীকক্ষে

let objB = customInit(carType:"Any String")

 navigationController?.pushViewController(objB,animated: true)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.