ক্লাস থেকে আমি কীভাবে স্টোরিবোর্ড লোড করতে পারি?


183

আমার সমস্যাটি হ'ল আমি স্টোরিবোর্ড এবং xib উভয়ই ব্যবহার করার উপায় খুঁজছিলাম । তবে স্টোরিবোর্ডটি প্রোগ্রামগতভাবে লোড করার এবং প্রদর্শন করার জন্য আমি সঠিক উপায় খুঁজে পাচ্ছি না। প্রজেক্টটি xib দিয়ে বিকাশ শুরু হয়েছিল এবং স্টোরিবোর্ডে সমস্ত xib ফাইল বাসা বাঁধাই এখন খুব কঠিন। সুতরাং আমি কোডে এটি করার উপায় খুঁজছিলাম, যেমন alloc, init, pushভিউকন্ট্রোলারদের জন্য for আমার ক্ষেত্রে স্টোরিবোর্ডে আমার কাছে কেবলমাত্র একজন নিয়ামক রয়েছে: UITableViewControllerযাতে আমি প্রদর্শন করতে চাই এমন কিছু সামগ্রীর সাথে স্থির ঘর রয়েছে। যদি কেউ বিশাল রিফ্যাক্টরিং ছাড়াই এক্সিব এবং স্টোরিবোর্ড উভয় দিয়েই কাজ করার সঠিক উপায় জানেন তবে আমি যে কোনও সহায়তার জন্য প্রশংসা করব।

উত্তর:


370

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

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

65
[sb instantiateInitialViewController]আপনি যদি দৃশ্যের ডিফল্ট ভিউ কন্ট্রোলারটি শুরু করতে চান তবে সুবিধাজনক।
অনুমান করুন

জেমস, আপনাকে ধন্যবাদ! স্টোরিবোর্ডের দৃষ্টিভঙ্গি কীভাবে ইনস্ট্যান্ট করা যায় তা বোঝার চেষ্টা করার জন্য আমি বেশ কিছুদিন ধরে অনুসন্ধান করে যাচ্ছিলাম। আপনার উত্তর (এবং কোকোকোর প্রশ্ন) সন্ধানে সর্বাধিক সতেজ।
bejonbee

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

11
যদি কেউ অ্যাপ প্রতিনিধিতে এটি কীভাবে করতে চান তা জানতে চাইলে আপনি [self presentViewcontroller]যুক্তিকে এই লাইনগুলির সাথে নিম্নলিখিত ক্রমে প্রতিস্থাপন করুন : 1) self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];2) self.window.rootViewController = vc;এবং 3) [self.window makeKeyAndVisible];। আপনি সম্ভবত modalTransitionStyleলাইনটি পরিত্রাণ পেতে পারেন কারণ এটি অ্যাপের প্রতিনিধি থেকে মডেল রূপান্তর নয়।
লেভিগুয়েজ

এফওয়াইআই, আপনি যদি নতুন স্টোপবোর্ডকে আধুনিকভাবে পপিংয়ের পরিবর্তে "চাপ" দিতে চান তবে চৈত্রভিরেশের উত্তরটি দেখুন।
অ্যাডাম জনস

76

সুইফট 3

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)

সুইফট 2

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)

পূর্বশর্ত

আপনার ভিউ কন্ট্রোলারে একটি স্টোরিবোর্ড আইডি বরাদ্দ করুন ।

স্টোরিবোর্ড আইডি

আইবি> পরিচয় পরিদর্শক> পরিচয়> স্টোরিবোর্ড আইডি দেখান

সুইফট (উত্তরাধিকার)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

সম্পাদনা: ফ্রেড এ একটি মন্তব্যে সুইফট 2 প্রস্তাবিত

আপনি যদি কোনও নেভিগেশন নিয়ন্ত্রণকারী ছাড়াই ব্যবহার করতে চান তবে আপনাকে নীচের মতো ব্যবহার করতে হবে:

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)

1
সুইফট 2, আপনি "? যেমন UIViewController" যোগ করতে হবে না, কম্পাইলার স্বয়ংক্রিয়ভাবে নির্ধারণ করে
ফ্রেডেরিক Adda,

2
বা আপনি ঠিক করতে self.storyboardএবং লাইন 1 এবং 2
মধু

17

অ্যাট্রিবিউট ইনস্পেক্টর সেই ভিউ কন্ট্রোলারের জন্য সনাক্তকারী দিন এবং নীচের কোডটি আমার পক্ষে কাজ করে

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];

5

এটা চেষ্টা কর

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];

আপনি যদি অন্য উত্তরগুলির মতো দেখায় কোনও ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার না করে থাকেন তবে এটি ব্যবহার করুন
latenitecoder

2

দ্রুতগতি মধ্যে
NavigationController এবং pushController তোমার জন্য প্রতিস্থাপন করতে পারেন

present(vc, animated:true , completion: nil)

1

3 এবং 4 এর সুইফ্টের জন্য , আপনি এটি করতে পারেন। ভালো অনুশীলন স্টোরিবোর্ডের নাম স্টোরিবোর্ড সমান

enum StoryBoardName{
   case second = "SecondViewController"
}
extension UIStoryBoard{
   class func load(_ storyboard: StoryBoardName) -> UIViewController{
      return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
   }
}

এবং তারপরে আপনি নিজের স্টোরবোর্ডটি আপনার ভিউকন্ট্রোলারে এইভাবে লোড করতে পারেন:

class MyViewController: UIViewController{
     override func viewDidLoad() {
        super.viewDidLoad()
        guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return}
        self.present(vc, animated: true, completion: nil)
     }

}

আপনি যখন নতুন স্টোরিবোর্ড তৈরি করেন কেবল স্টোরিবোর্ডে একই নামটি সেট করুন এবং আপনার এনাম " স্টোরিবোর্ডনেম" তে স্টোরিবোর্ডের নাম যুক্ত করুন


0

আপনি সবসময় রুট কন্ট্রোলারের ডানদিকে লাফাতে পারেন:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

0

নিচে এক্সটেনশন আপনি একটি লোড করার অনুমতি দেয় হবে Storyboardএবং এটি সংযুক্ত UIViewController। উদাহরণ: আপনার যদি "মডেলআলার্ট" নামে একটি UIViewControllerনামযুক্ত ModalAlertViewControllerএবং একটি স্টোরিবোর্ড থাকে তবে

let vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")

উভয় লোড হবে Storyboardএবং UIViewControllerএবং vcধরনের হতে হবে ModalAlertViewControllerনোট অনুমান করে যে স্টোরিবোর্ডের স্টোরিবোর্ড আইডিটির স্টোরিবোর্ডের একই নাম এবং স্টোরিবোর্ডটি ইজ ইনিশিয়াল ভিউ কন্ট্রোলার হিসাবে চিহ্নিত হয়েছে ।

extension UIViewController {
    /// Loads a `UIViewController` of type `T` with storyboard. Assumes that the storyboards Storyboard ID has the same name as the storyboard and that the storyboard has been marked as Is Initial View Controller.
    /// - Parameter storyboardName: Name of the storyboard without .xib/nib suffix.
    static func loadStoryboard<T: UIViewController>(_ storyboardName: String) -> T? {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        if let vc = storyboard.instantiateViewController(withIdentifier: storyboardName) as? T {
            vc.loadViewIfNeeded() // ensures vc.view is loaded before returning
            return vc
        }
        return nil
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.