স্টোরিবোর্ডে কাস্টম ভিউ কন্ট্রোলারের বিভিন্ন সাবক্লাস ইনস্ট্যান্ট করা সম্ভব, যদিও এতে কিছুটা অপ্রচলিত কৌশল জড়িত: alloc
ভিউ কন্ট্রোলারের জন্য পদ্ধতিটি ওভাররাইড করে । কাস্টম ভিউ কন্ট্রোলার তৈরি করা হলে, ওভাররাইড বরাদ্দ পদ্ধতি বাস্তবে alloc
সাবক্লাসে চলার ফলাফল প্রদান করে।
আমার এই উত্তরটি প্রিভিসো দিয়ে বলা উচিত, যদিও আমি এটি বিভিন্ন পরিস্থিতিতে পরীক্ষা করে দেখেছি এবং কোনও ত্রুটি না পেয়েছি, তবে এটি আরও জটিল সেট আপগুলির সাথে মোকাবিলা করবে কিনা তা আমি নিশ্চিত করতে পারি না (তবে এটি কাজ না করার কোনও কারণ আমি দেখতে পাই না) । এছাড়াও, আমি এই পদ্ধতিটি ব্যবহার করে কোনও অ্যাপ্লিকেশন জমা দিইনি, সুতরাং এটির বাইরের সম্ভাবনা রয়েছে যে এটি অ্যাপলের পর্যালোচনা প্রক্রিয়াটি দ্বারা প্রত্যাখ্যাত হতে পারে (যদিও আবার এটির কেন কারণ নেই তা আমি দেখতে পাচ্ছি)।
প্রদর্শনের উদ্দেশ্যে, আমার কাছে UIViewController
ডাকা একটি সাবক্লাস রয়েছে TestViewController
, যার একটি ইউআইএলবেল আইবিউলেট এবং একটি আইবিএ রয়েছে। আমার স্টোরিবোর্ডে, আমি একটি ভিউ কন্ট্রোলার যুক্ত করেছি এবং এর ক্লাসটি সংশোধন TestViewController
করেছি এবং আইবিআউটলেটকে একটি ইউআইএলবেল এবং আইবিএশনকে একটি ইউআইবুটনের সাথে সংযুক্ত করেছি। আমি পূর্ববর্তী ভিউকন্ট্রোলারে একটি ইউআইবাটন দ্বারা চালিত একটি মডেল সেগুয়ের মাধ্যমে টেস্টভিউ কনট্রোলার উপস্থাপন করি।
কোন ক্লাসটি ইনস্ট্যান্ট হয় তা নিয়ন্ত্রণ করতে, আমি একটি স্থিতিশীল ভেরিয়েবল এবং সম্পর্কিত শ্রেণিবদ্ধ পদ্ধতি যুক্ত করেছি যাতে সাবক্লাসটি ব্যবহার করতে সেট / সেট করুন (আমার ধারণা অনুমান করা হয় যে কোন সাবক্লাসটি ইনস্ট্যান্ট করতে হবে তা নির্ধারণের অন্যান্য উপায়গুলি গ্রহণ করতে পারে):
TestViewController.m:
#import "TestViewController.h"
@interface TestViewController ()
@end
@implementation TestViewController
static NSString *_classForStoryboard;
+(NSString *)classForStoryboard {
return [_classForStoryboard copy];
}
+(void)setClassForStoryBoard:(NSString *)classString {
if ([NSClassFromString(classString) isSubclassOfClass:[self class]]) {
_classForStoryboard = [classString copy];
} else {
NSLog(@"Warning: %@ is not a subclass of %@, reverting to base class", classString, NSStringFromClass([self class]));
_classForStoryboard = nil;
}
}
+(instancetype)alloc {
if (_classForStoryboard == nil) {
return [super alloc];
} else {
if (NSClassFromString(_classForStoryboard) != [self class]) {
TestViewController *subclassedVC = [NSClassFromString(_classForStoryboard) alloc];
return subclassedVC;
} else {
return [super alloc];
}
}
}
আমার পরীক্ষার জন্য আমার দুটি সাবক্লাস রয়েছে TestViewController
: RedTestViewController
এবং GreenTestViewController
। উপশ্রেণীর প্রত্যেকের অতিরিক্ত বৈশিষ্ট্য রয়েছে এবং প্রতিটি ওভাররাইড viewDidLoad
ভিউটির পটভূমির রঙ পরিবর্তন করতে এবং UILabel IBOutlet এর পাঠ্য আপডেট করতে পারে:
RedTestViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
self.testLabel.text = @"Set by RedTestVC";
}
GreenTestViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor greenColor];
self.testLabel.text = @"Set by GreenTestVC";
}
কিছু উপলক্ষ্যে আমি TestViewController
নিজেই অন্য সময়ে RedTestViewController
বা তাত্ক্ষণিকভাবে চাইতে চাই GreenTestViewController
। পূর্ববর্তী ভিউ কন্ট্রোলারে, আমি নীচে এলোমেলোভাবে এটি করি:
NSInteger vcIndex = arc4random_uniform(4);
if (vcIndex == 0) {
NSLog(@"Chose TestVC");
[TestViewController setClassForStoryBoard:@"TestViewController"];
} else if (vcIndex == 1) {
NSLog(@"Chose RedVC");
[TestViewController setClassForStoryBoard:@"RedTestViewController"];
} else if (vcIndex == 2) {
NSLog(@"Chose BlueVC");
[TestViewController setClassForStoryBoard:@"BlueTestViewController"];
} else {
NSLog(@"Chose GreenVC");
[TestViewController setClassForStoryBoard:@"GreenTestViewController"];
}
নোট করুন যে setClassForStoryBoard
পদ্ধতিটি কোনও শ্রেণীর মিশ্রণগুলি এড়ানোর জন্য অনুরোধ করা শ্রেণীর নামটি সত্যই টেস্টভিউ কনট্রোলারের একটি সাবক্লাস কিনা তা পরীক্ষা করে দেখুন। BlueTestViewController
এই কার্যকারিতাটি পরীক্ষা করার জন্য উপরের রেফারেন্সটি রয়েছে।