সুইফটে একটি ভিউ কন্ট্রোলার ইনস্ট্যান্ট করুন এবং উপস্থাপন করুন


299

সমস্যা

আমি নতুন একটি বর্ণন গ্রহণ শুরু SwiftউপরXcode 6 , এবং আমি কিছু ডেমো প্রকল্প এবং টিউটোরিয়াল চেষ্টা করে। এখন আমি আটকে আছি:

ইনস্ট্যান্টেশন এবং তারপরে viewControllerএকটি নির্দিষ্ট স্টোরিবোর্ড থেকে একটি উপস্থাপন

উদ্দেশ্য-সি সমাধান

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];

কীভাবে এটি সুইফটে অর্জন করবেন?

উত্তর:


647

এই উত্তরটি সর্বশেষে সুইফ্ট 5.2 এবং আইওএস 13.4 এসডিকে জন্য সংশোধিত হয়েছিল।


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

let storyboard = UIStoryboard(name: "myStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "myVCID")
self.present(vc, animated: true)

আপনার যদি সমস্যা হয় init(coder:), তবে দয়া করে এরইডিবির উত্তরটি দেখুন


3
আপনি বাদ দিতে পারেন ;! ;) আপনি কি এ সম্পর্কে বিস্তারিত বলতে আপত্তি করবেন as UIViewController? কেন এটি প্রয়োজনীয়?
সেবাস্তিয়ান ওয়ারাম্বা

5
asকীওয়ার্ড টাইপকাস্টিংয়ের জন্য ব্যবহৃত হয়। এটি (UIViewController *)anObjectউদ্দেশ্য সি হিসাবে একই
গারোয়াল

1
হ্যাঁ আমি জানি আমি সেগুলি বাদ দিতে পারি তবে এটি দীর্ঘ অভ্যাসের একটি অংশ। : ডি instantiateViewControllerWithIdentifierরিটার্ন হিসাবে AnyObject( idসুইফ্টের সমতুল্য) এবং আমি vcহিসাবে ঘোষণা UIViewControllerকরি, আমাকে টাইপকাস্ট AnyObjectকরতে হবে UIViewController
আকাশীবস্কি

হাই বন্ধুরা, আমি কিছু অন্য সমস্যার মুখোমুখি হয়েছি, এই কোডটি আমার আইপ্যাড 2-তে নয়, আইওএস ভি .1.১.২ রয়েছে এমন সিমুলেটারে চালিত হয়। যদি আপনি কিছু মনে করেন না এই সমস্যাটি সমাধান করতে আমাকে সহায়তা করুন।
ইন্দ্র

3
@akashivskyy অবশ্যই আপনার কাছে। তবে কারও কাছে নাও হতে পারে।
এমএমসি

43

@ আকাশীবস্কি'র উত্তরগুলি তাত্ক্ষণিকভাবে ব্যবহার করার জন্য UIViewControllerএবং এর ব্যতিক্রম রয়েছে:

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

দ্রুত নির্দেশনা:

required init?(coder aDecoder: NSCoder)আপনার গন্তব্যটিতে ম্যানুয়ালি প্রয়োগ করুন UIViewControllerযা আপনি ইনস্ট্যান্ট করার চেষ্টা করছেন

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

আপনার যদি আরও বিবরণ প্রয়োজন হয় তবে দয়া করে আমার উত্তর এখানে দেখুন


আপনি যদি কাস্টম ইনিশিয়েটরটি ব্যবহার করতে চান তবে আপনি সুপার সুপারইনাইট (নিবনাম: নীল, বান্ডিল: নীল) দিয়ে সুপারকে কল করতে পারেন এবং চাবুক জরিমানা লোড করবে বা তাদের নাম এনআইবি ফাইলের সাথে কল করবে।
ব্যবহারকারী 1700737

4
@ ব্যবহারকারী 1700737 আমি স্টোরিবোর্ডকে উল্লেখ করে ভিউ কন্ট্রোলারটি ইনস্ট্যান্ট করছি, যা ইনিউইনডিব না দিয়ে, ইনিউইথকোডার কার্যকর করে। এই প্রশ্নের পড়ুন stackoverflow.com/questions/24036393/...
ই-Riddie

হাই বন্ধুরা, আমি কিছু অন্য সমস্যার মুখোমুখি হয়েছি, এই কোডটি আমার আইপ্যাড 2-তে নয়, আইওএস ভি .1.১.২ রয়েছে এমন সিমুলেটারে চলে। যদি আপনি কিছু মনে করেন না এই সমস্যাটি সমাধান করতে আমাকে সহায়তা করুন।
ইন্দ্র

@ ইন্দ্রা আপনাকে স্ট্যাকের উপর আরেকটি প্রশ্ন জিজ্ঞাসা করতে হবে, আমাকে লিঙ্কটি দিন আমি আপনাকে সাহায্য করে খুশি!
ই-রিদ্দি

সুইফট 1.2 এ আপনাকে অবশ্যই init(coder aDecoder: NSCoder!)"প্রয়োজনীয়" করতে হবে। সুতরাং এখন আপনাকে নিম্নলিখিত লিখতে হবে:required init(coder aDecoder: NSCoder!)
এডুয়ার্ডো ভিয়েগাস

18

এই লিঙ্কটিতে দুটি বাস্তবায়ন রয়েছে:

সুইফট:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)

উদ্দেশ্য গ

UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];

এই লিঙ্কটিতে একই স্টোরিবোর্ডে ভিউকন্ট্রোলার শুরু করার কোড রয়েছে

/*
 Helper to Switch the View based on StoryBoard
 @param StoryBoard ID  as String
*/
func switchToViewController(identifier: String) {
    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(identifier) as! UIViewController
    self.navigationController?.setViewControllers([viewController], animated: false)

}

15

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

সুইফট:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

OBJ-সি:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];

12

সুইফট ৪.২ আপডেট হওয়া কোড

let storyboard = UIStoryboard(name: "StoryboardNameHere", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "ViewControllerNameHere")
self.present(controller, animated: true, completion: nil)

7
// "Main" is name of .storybord file "
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// "MiniGameView" is the ID given to the ViewController in the interfacebuilder
// MiniGameViewController is the CLASS name of the ViewController.swift file acosiated to the ViewController
var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MiniGameView") as MiniGameViewController
var rootViewController = self.window!.rootViewController
rootViewController?.presentViewController(setViewController, animated: false, completion: nil)

আমি এটি অ্যাপডিলেজেটে রাখার সময় এটি আমার পক্ষে ভাল কাজ করেছে


7

আপনি যদি এটি আধুনিকভাবে উপস্থাপন করতে চান তবে আপনার বেলো জাতীয় কিছু হওয়া উচিত:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)

5

আমি একটি অনেক পরিষ্কার উপায় প্রস্তাব করতে চাই। যখন আমাদের একাধিক স্টোরিবোর্ড থাকবে তখন এটি কার্যকর হবে

1. আপনার সমস্ত স্টোরিবোর্ড সহ একটি কাঠামো তৈরি করুন

struct Storyboard {
      static let main = "Main"
      static let login = "login"
      static let profile = "profile" 
      static let home = "home"
    }

২. এর মতো একটি ইউআইএসটিবোর্ড এক্সটেনশন তৈরি করুন

extension UIStoryboard {
  @nonobjc class var main: UIStoryboard {
    return UIStoryboard(name: Storyboard.main, bundle: nil)
  }
  @nonobjc class var journey: UIStoryboard {
    return UIStoryboard(name: Storyboard.login, bundle: nil)
  }
  @nonobjc class var quiz: UIStoryboard {
    return UIStoryboard(name: Storyboard.profile, bundle: nil)
  }
  @nonobjc class var home: UIStoryboard {
    return UIStoryboard(name: Storyboard.home, bundle: nil)
  }
}

ক্লাসের নাম হিসাবে স্টোরিবোর্ড শনাক্তকারীকে দিন এবং ইনস্ট্যান্টিয়েট করার জন্য নীচের কোডটি ব্যবহার করুন

let loginVc = UIStoryboard.login.instantiateViewController(withIdentifier: "\(LoginViewController.self)") as! LoginViewController

কি জন্য @ ননবজক?
স্ট্যাকরুনার

1
@ স্ট্যাক রুনার এটি উদ্দেশ্য সি
XcodeNOOB

3

সুইফট 4:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let yourVC: YourVC = storyboard.instantiateViewController(withIdentifier: "YourVC") as! YourVC

2

আপনার যদি কোনও ভিউকন্ট্রোলার কোনও স্টোরিবোর্ড / এক্সিব ব্যবহার না করে থাকেন তবে নীচের কলের মতো আপনি এই বিশেষ উপাচার্যে যেতে পারেন:

 let vcInstance : UIViewController   = yourViewController()
 self.present(vcInstance, animated: true, completion: nil)

আমি এটি পেয়েছি: "এটি নির্মাণযোগ্য হতে পারে না কারণ এর কোনও অ্যাক্সেসযোগ্য প্রারম্ভক নেই"।
পল বুনতেউ

স্টোরিবোর্ডের তৈরি আউটলেটগুলি এবং অন্যান্য সম্পর্কগুলি হারিয়ে গেছে
jose920405

2

সুইফট 3 স্টোরিবোর্ড

let settingStoryboard : UIStoryboard = UIStoryboard(name: "SettingViewController", bundle: nil)
let settingVC = settingStoryboard.instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController
self.present(settingVC, animated: true, completion: {

})

1

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

আমি একটি বিল্ড টাইম স্ক্রিপ্ট তৈরি করেছি (যা আপনি এখানে অ্যাক্সেস করতে পারেন ), যা প্রদত্ত প্রকল্পের মধ্যে থাকা সমস্ত স্টোরিবোর্ড থেকে দর্শন নিয়ন্ত্রকদের অ্যাক্সেস এবং ইনস্ট্যান্ট করার জন্য একটি সংকলক নিরাপদ উপায় তৈরি করবে।

উদাহরণস্বরূপ, মেইন.স্টোরিবোর্ডে ভিসি 1 নামের ভিউ কন্ট্রোলারটি ততক্ষণে ইনস্ট্যান্ট হবে:

let vc: UIViewController = R.storyboard.Main.vc1^  // where the '^' character initialize the controller

1

আমি যা চেষ্টা করেছি তা বিবেচনা করেই, এটি কেবল আমার পক্ষে কাজ করবে না - কোনও ত্রুটি নেই, তবে আমার স্ক্রিনে কোনও নতুন ভিউ নিয়ন্ত্রক নেই। কেন জানি না, কিন্তু সময়সীমা ফাংশন এটিকে মোড়ানো শেষ পর্যন্ত এটি কার্যকর করে তোলে:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}


0

আমি একটি লাইব্রেরি তৈরি করেছি যা আরও ভাল সিনট্যাক্সের সাহায্যে আরও সহজ করে তুলবে:

https://github.com/Jasperav/Storyboardable

শুধু Storyboard.swift পরিবর্তন এবং দিন ViewControllersসাথে সামঞ্জস্য Storyboardable

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