আমি যতদূর বলতে পারি, কখনও কখনও ইউআইএনএভিগেশনবারকে সাবক্লাস করা দরকার হয়, কিছু অমানুষিক স্ট্যান্ডার্ড রিসাইলিং করা। বিভাগগুলি ব্যবহার করে এটি করা থেকে বিরত হওয়া কখনও কখনও সম্ভব তবে সবসময় নয়।
বর্তমানে, আমি যতদূর জানি, ইউআইভিউকন্ট্রোলারের মধ্যে কাস্টম ইউআইএনএভিগেশন বার সেট করার একমাত্র উপায় আইবি (যা কোনও সংরক্ষণাগার মাধ্যমে) হয় - এটি সম্ভবত সেভাবে হওয়া উচিত নয়, তবে আপাতত, আমরা এটির সাথেই বেঁচে থাকব।
এটি প্রায়শই সূক্ষ্ম হয় তবে কখনও কখনও আইবি ব্যবহার করা সত্যিই সম্ভব হয় না।
সুতরাং, আমি তিনটি বিকল্প দেখেছি:
- সাবক্লাস ইউআইএনএভিগেশন বার এবং এটি সমস্ত আইবিতে জড়িয়ে রাখুন, তারপরে যতবারই আমি ইউআইএনএভিগেশন কন্ট্রোলার চাইতাম তখনই নিব লোড করা নিয়ে ব্যঙ্গ করে,
- সাবক্লাসিংয়ের পরিবর্তে, ইউআইএনএভিগেশনবারের আচরণ পরিবর্তন করতে একটি বিভাগের মধ্যে পদ্ধতি প্রতিস্থাপন ব্যবহার করুন বা
- সাবক্লাস ইউআইএনএভিগেশন বার এবং ইউআইএনএভিগেশন কন্ট্রোলার সংরক্ষণাগারভুক্ত / সংরক্ষণাগারবদ্ধ করার বিষয়ে কিছুটা মাকিং কর।
এই ক্ষেত্রে বিকল্পটি আমার জন্য অপরিবর্তনীয় (বা কমপক্ষে খুব বিরক্তিকর) ছিল, যেমন আমি ইউআইএনএভিগেশন কন্ট্রোলার প্রোগ্রামগতভাবে তৈরি করার দরকার ছিল, 2 আমার মতে কিছুটা বিপজ্জনক এবং শেষ-রিসর্ট বিকল্প হিসাবে আরও বেশি, তাই আমি বিকল্প 3 বেছে নিয়েছি।
আমার দৃষ্টিভঙ্গি ছিল একটি ইউআইএনএভিগেশন কন্ট্রোলারের একটি 'টেম্পলেট' সংরক্ষণাগার তৈরি করা এবং এটি সংরক্ষণ করে সংরক্ষণাগার ফিরিয়ে দেওয়া initWithRootViewController
।
এখানে কীভাবে:
আইবিতে, আমি ইউআইএনএভিগেশনবারের জন্য উপযুক্ত শ্রেণীর সেট সহ একটি ইউআইএনএভিগেশন কন্ট্রোলার তৈরি করেছি।
তারপরে, আমি বিদ্যমান নিয়ামকটি নিয়েছিলাম এবং এটির একটি সংরক্ষণাগারভুক্ত কপি ব্যবহার করে সংরক্ষণ করেছি +[NSKeyedArchiver archiveRootObject:toFile:]
। আমি সিমুলেটারে সবেমাত্র অ্যাপের প্রতিনিধিটির মধ্যে এটি করেছি।
তারপরে আমি আমার সাবক্লাসে সংরক্ষণাগারিত সংস্করণটি এম্বেড করতে, সংরক্ষিত ফাইল থেকে সি কোড তৈরি করতে -i পতাকা সহ 'xxd' ইউটিলিটিটি ব্যবহার করেছি xxd -i path/to/file
।
মধ্যে initWithRootViewController
আমি আর্কাইভ মুক্ত যে টেমপ্লেট, এবং আর্কাইভ মুক্ত ফলাফলের সাথে প্রাসঙ্গিক সেট স্ব:
static unsigned char archived_controller[] = {
0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30, 0xd4, 0x01, 0x02, 0x03,
...
};
static unsigned int archived_controller_len = 682;
...
- (id)initWithRootViewController:(UIViewController *)rootViewController {
[self release];
self = (CTNavigationController*)[NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithBytes:archived_controller length:archived_controller_len]];
[self setViewControllers:[NSArray arrayWithObject:rootViewController]];
return [self retain];
}
তারপরে, আমি কেবলমাত্র আমার ইউআইভিউকন্ট্রোলার সাবক্লাসের একটি নতুন উদাহরণ দখল করতে পারি যার কাস্টম নেভিগেশন বার সেট রয়েছে:
UIViewController *modalViewController = [[[CTNavigationController alloc] initWithRootViewController:myTableViewController] autorelease];
[self.navigationController presentModalViewController:modalViewController animated:YES];
এটি আমাকে একটি নেভিগেশন বার এবং সরঞ্জামদণ্ডের সাথে সেট আপ করা এবং কাস্টম নেভিগেশন বারের স্থানে ক্লাস সহ একটি মডেল ইউআইটিএবলভিউ কনট্রোলার দেয়। আমার কোনও সামান্য-ন্যক্কারজনক পদ্ধতি প্রতিস্থাপন করার দরকার পড়েনি, এবং যখন আমি সত্যিই প্রোগ্রামালিকভাবে কাজ করতে চাই তখন আমাকে নিবসের সাথে বিদ্রূপ করতে হবে না।
আমি +layerClass
ইউআইএনএভিগেশন কন্ট্রোলারের মধ্যে সমতুল্য দেখতে চাই - +navigationBarClass
- তবে আপাতত, এটি কাজ করে।