เท่าที่ฉันสามารถบอกได้บางครั้งจำเป็นที่จะต้อง subclass UINavigationBar เพื่อทำการ restyling ที่ไม่ได้มาตรฐาน บางครั้งก็เป็นไปได้ที่จะหลีกเลี่ยงการใช้หมวดหมู่แต่ก็ไม่เสมอไป
ปัจจุบันเท่าที่ฉันรู้มีเพียงวิธีในการตั้งค่า UINavigationBar ที่กำหนดเองภายใน UIViewController คือผ่านทาง IB (นั่นคือผ่านไฟล์เก็บถาวร) - มันอาจจะไม่เป็นอย่างนั้น แต่สำหรับตอนนี้เราต้องอยู่กับมัน
ซึ่งมักจะใช้ได้ดี แต่บางครั้งการใช้ IB ก็ไม่สามารถทำได้จริงๆ
ดังนั้นฉันเห็นสามตัวเลือก:
- UINavigationBar คลาสย่อยและเชื่อมต่อทั้งหมดใน IB จากนั้นยุ่งเกี่ยวกับการโหลดหัวปากกาทุกครั้งที่ฉันต้องการ UINavigationController
- ใช้วิธีการแทนที่ภายในหมวดหมู่เพื่อเปลี่ยนลักษณะการทำงานของ UINavigationBar แทนที่จะเป็นคลาสย่อยหรือ
- Subclass UINavigationBar และทำการโกงเล็กน้อยเกี่ยวกับการเก็บ / ยกเลิกการเก็บ UINavigationController
ตัวเลือกที่ 1 เป็นไปไม่ได้ (หรืออย่างน้อยก็น่ารำคาญเกินไป) สำหรับฉันในกรณีนี้เนื่องจากฉันต้องการสร้าง UINavigationController โดยทางโปรแกรม 2 เป็นอันตรายเล็กน้อยและเป็นทางเลือกสุดท้ายมากกว่าในความคิดของฉันดังนั้นฉันจึงเลือกตัวเลือกที่ 3
วิธีการของฉันคือการสร้าง 'แม่แบบ' เก็บของ UINavigationController initWithRootViewController
และยกเลิกการเก็บถาวรว่ามันจะกลับมาใน
วิธีการมีดังนี้
ใน IB ฉันสร้าง UINavigationController ด้วยคลาสที่เหมาะสมสำหรับ UINavigationBar
จากนั้นฉันจึงใช้คอนโทรลเลอร์ที่มีอยู่และบันทึกสำเนาที่เก็บถาวรโดยใช้+[NSKeyedArchiver archiveRootObject:toFile:]
. ฉันเพิ่งทำสิ่งนี้ภายในตัวแทนแอปในโปรแกรมจำลอง
จากนั้นฉันใช้ยูทิลิตี้ 'xxd' กับแฟล็ก -i เพื่อสร้างรหัส c จากไฟล์ที่บันทึกไว้เพื่อฝังเวอร์ชันที่เก็บถาวรในคลาสย่อยของฉัน ( 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 ของฉันซึ่งมีชุดแถบการนำทางที่กำหนดเอง:
UIViewController *modalViewController = [[[CTNavigationController alloc] initWithRootViewController:myTableViewController] autorelease];
[self.navigationController presentModalViewController:modalViewController animated:YES];
สิ่งนี้ทำให้ฉันมี UITableViewController แบบโมดอลที่มีแถบนำทางและแถบเครื่องมือที่ตั้งค่าไว้ทั้งหมดและด้วยคลาสแถบการนำทางที่กำหนดเอง ฉันไม่จำเป็นต้องเปลี่ยนวิธีการที่น่ารังเกียจเล็กน้อยและฉันไม่จำเป็นต้องยุ่งเกี่ยวกับปลายปากกาเมื่อฉันแค่ต้องการทำงานโดยใช้โปรแกรมจริงๆ
ฉันต้องการเห็นสิ่งที่เทียบเท่า+layerClass
ภายใน UINavigationController - +navigationBarClass
- แต่สำหรับตอนนี้มันใช้งานได้