স্টোরিবোর্ড - অ্যাপডেলিগেটে ভিউকন্ট্রোলার পড়ুন


122

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

অর্থাত্ অ্যাপডেলিগেটের মধ্যে আমি বেস ভিউকন্ট্রোলারের মতো এটি পেতে পারি

(MyViewController*) self.window.rootViewController

তবে স্টোরিবোর্ডের মধ্যে থাকা অন্য কোনও ভিউকন্ট্রোলার সম্পর্কে কীভাবে?


এই উত্তরটি পরীক্ষা করুন । এটি দ্রুত, তবে ভাষা একই রকম similar
বোরঝ

উত্তর:


165

এর জন্য ডকুমেন্টেশনটি দেখুন -[UIStoryboard instantiateViewControllerWithIdentifier:]। এটি আপনাকে আইবি অ্যাট্রিবিউটস ইন্সপেক্টরটিতে সেট করা শনাক্তকারী ব্যবহার করে আপনার স্টোরিবোর্ড থেকে একটি ভিউ কন্ট্রোলার ইনস্ট্যান্ট করতে সহায়তা করে:

এখানে চিত্র বর্ণনা লিখুন

উদাহরণ কোড যুক্ত করতে সম্পাদনা করুন:

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                         bundle: nil];

MyViewController *controller = (MyViewController*)[mainStoryboard 
                    instantiateViewControllerWithIdentifier: @"<Controller ID>"];

হাই রবিন, তার জন্য ধন্যবাদ! আমি এই ডকটির দিকে তাকিয়েছি তবে শব্দগুলি তাত্ক্ষণিকভাবে শুরু করেছে এবং প্রাথমিকভাবে মিশে গেছে ... এটি আমাদের পেয়ে যায় (আপনার নির্দেশ অনুসরণ করার পরে :) (উত্তরে কোড বিন্যাসের অভাব ...) ইউআইএসটিবোর্ড * মেইনস্টিরিবোর্ড = [ইউআইএসটিবোর্ড স্টোরিবোর্ড উইথনাম: @ "মেইনস্টেরিবোর্ড" বান্ডিল: শূন্য]; মাইভিউকন্ট্রোলার * এইকন্ট্রোলার = (মাইভিউকন্ট্রোলার *) [মেইনস্টিরিবোর্ড ইনস্ট্যানিয়েটভিউকন্ট্রোলারভিথআইডিটিফায়ার: @ "মাইভিসি"];
ম্যাথিয়াস ডি

যে কেউ এটিকে দেখছে তাদের ফর্ম্যাট করার সাথে উত্তরে আপনার উদাহরণ কোডটি যুক্ত করেছি।
রবিন সামারহিল

24
আপনি যদি সর্বজনীন অ্যাপ্লিকেশন তৈরি করে থাকেন তবে মেইনস্টিরিবোর্ড_আইফোন / মেইনস্টিরিবোর্ড_আইপ্যাডটি ব্যবহার করবেন তা নিশ্চিত হন অন্যথায় আপনি ক্রাশ পাবেন।
Roselsel

16
প্রতিনিধিটির মধ্যে থেকে আপনি আপনার তথ্য দ্বারা লোড স্টোরিবোর্ড উদাহরণটি অ্যাক্সেস করতে পারেন pপুলিস্ট: [[[self window] rootViewController] storyboard] ডক্স অনুসারে এটি "স্টোরিবোর্ডটি ফিরে আসবে যেখানে থেকে দৃশ্যের নিয়ামকটির উদ্ভব হয়েছিল।" (অথবা শূন্য এটি একটি স্টোরিবোর্ড থেকে আসে না থাকেন)। সেই ইউআইএসটিরিবোর্ড * থেকে আপনি ইনস্টলটিট কলগুলি ব্যবহার করতে পারেন যা @ রবিনসমারহিল উল্লেখ করেছেন। নোট করুন যে স্টোরিবোর্ডগুলি আপনার ভিউকন্ট্রোলারদের ( দৃশ্যের ) নতুন প্রয়োজন যেমন ইনস্ট্যান্ট করে তাদের প্রয়োজন যেমন পূর্বে দেখা হয়েছিল সেগুলি পুনরায় ব্যবহার করে না।
ট্যাড বামক্রোট

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

41

যদি আপনি XCode5 ব্যবহার করেন তবে আপনার এটি অন্যভাবে করা উচিত।

  • আপনার UIViewControllerমধ্যে নির্বাচন করুনUIStoryboard
  • যান Identity Inspectorউপরে ডান দিকের ফলকে
  • Use Storyboard IDচেকবক্সটি চেক করুন
  • Storyboard IDক্ষেত্রে একটি অনন্য আইডি লিখুন

তারপরে আপনার কোডটি লিখুন।

// Override point for customization after application launch.

if (<your implementation>) {
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" 
                                                             bundle: nil];
    YourViewController *yourController = (YourViewController *)[mainStoryboard 
      instantiateViewControllerWithIdentifier:@"YourViewControllerID"];
    self.window.rootViewController = yourController;
}

return YES;

4
আমি যতদূর জানি এবং এটি চেষ্টা করতে সক্ষম হন হিসেবে এই আপডেট উত্তর।
gnclmorais

একটি স্টোরিবোর্ডের নামটি ফাইল-নাম ছাড়াই এক্সটেনশন ছাড়াই এটি "মেইন_আইফোন" বা "মাইন_আইপ্যাড" হতে পারে যদি আপনি নিজের প্রকল্পটি সেভাবে সেট আপ করেন।
ব্রায়ান হোয়াইট

এবং তারপরে আমরা লগইন করার পরে কীভাবে মূল রুটভিউ কনট্রোলারে ফিরে যেতে পারি। কমপক্ষে আইওএস and এবং এক্সকোড ৫.০.২ সম্পর্কে আমার জ্ঞান অনুসারে - রুট ভিউ কন্ট্রোলার ফিরিয়ে দেওয়া তাত্ক্ষণিকভাবে এবং অ্যানিমেশন ছাড়াই দর্শনক্রমক্রমকে স্যুইচ করবে। ইউএক্স টিম কম কোডারকে হত্যা করেছে।
LOL

আমি কীভাবে সুইফটটি ব্যবহার করে এটি করব?
লিও ডাবাস

8

সাধারণত, সিস্টেমটি স্টোরিবোর্ডের সাথে ভিউ কন্ট্রোলার ইনস্ট্যান্টেশন পরিচালনা করতে হবে। আপনি যা চান তা হ'ল self.window.rootViewControllerনিয়ন্ত্রককে ভিউ কন্ট্রোলার শুরুর বিপরীতে একটি রেফারেন্স ধরে ধরে ভিউ কন্ট্রোলার হায়ারার্কিকে অতিক্রম করে যা ইতিমধ্যে আপনার স্টোরিবোর্ডটি সঠিকভাবে সেটআপ করা হলে এটি ইতিমধ্যে সঠিকভাবে শুরু করা উচিত।

সুতরাং, আসুন আমরা বলি যে আপনি rootViewControllerএকটি ইউআইএনএভিগেশন কন্ট্রোলার এবং তারপরে আপনি এর শীর্ষ ভিউ কন্ট্রোলারের কাছে কিছু পাঠাতে চান, আপনি আপনার অ্যাপডেলিগেটে এটি এরকম করুন didFinishLaunchingWithOptions:

UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;

সুইফটে যদি খুব মিল হয়:

let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data

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


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