ปุ่ม "ย้อนกลับ" ของUINavigationController
โดยค่าเริ่มต้นจะแสดงชื่อของมุมมองล่าสุดในสแต็ก มีวิธีที่จะมีข้อความที่กำหนดเองในปุ่มย้อนกลับแทนหรือไม่?
ปุ่ม "ย้อนกลับ" ของUINavigationController
โดยค่าเริ่มต้นจะแสดงชื่อของมุมมองล่าสุดในสแต็ก มีวิธีที่จะมีข้อความที่กำหนดเองในปุ่มย้อนกลับแทนหรือไม่?
คำตอบ:
จากลิงค์นี้ :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
ดังที่ไทเลอร์กล่าวไว้ในความคิดเห็น:
อย่าทำสิ่งนี้ในตัวควบคุมมุมมองที่มองเห็นได้ แต่ในตัวควบคุมมุมมองที่คุณเห็นว่าคุณกดปุ่มย้อนกลับ
release
UIBarButtonItem
UIBarButtonItemStyleBordered
self.navigationItem.backBarButtonItem.style
เอกสารประกอบ: developer.apple.com/library/ios/documentation/uikit/reference/
คุณสามารถตั้งค่าข้อความในเครื่องมือสร้างส่วนต่อประสาน:
เลือกรายการการนำทางของ ViewController ที่ปุ่มย้อนกลับจะกลับไปที่:
ในตัวตรวจสอบแอ็ตทริบิวต์ของแผงเครื่องมือให้ป้อนชื่อของคุณสำหรับปุ่มย้อนกลับ
ฉันต้องการวิธีนี้มากกว่าการตั้งชื่อเป็นรหัสในคำตอบที่ยอมรับ
นอกจากนี้โปรดทราบว่าคุณต้องทำสิ่งนี้ในมุมมองคอนโทรลเลอร์หนึ่งระดับขึ้นไปบนสแต็ก ในคำอื่น ๆ อย่าทำเช่นนี้ในตัวควบคุมมุมมองที่มองเห็น แต่ในตัวควบคุมมุมมองที่คุณจะเห็นว่าคุณกดปุ่มย้อนกลับ
--Tyler
ฉันใช้สิ่งนี้:
// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.backItem.title = @"Custom text";
}
ฉันพบวิธีแก้ปัญหาที่ใช้งานง่ายเพียงแค่ตั้งชื่อของคอนโทรลเลอร์ก่อนที่จะดันคอนโทรลเลอร์อื่นลงบนสแต็กดังนี้:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
จากนั้นตรวจสอบให้แน่ใจว่าได้ตั้งชื่อดั้งเดิมไว้viewWillAppear
เช่นนี้
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
สิ่งนี้ทำงานได้เนื่องจากพฤติกรรมเริ่มต้นของUINavigationController
เมื่อสร้างปุ่มย้อนกลับในระหว่างการดำเนินการผลักดันคือการใช้ชื่อจากตัวควบคุมก่อนหน้านี้
หัวเรื่องของปุ่มย้อนกลับเป็นค่าเริ่มต้นของชื่อมุมมองก่อนหน้าดังนั้นเคล็ดลับที่รวดเร็วที่ฉันใช้คือการวางรหัสต่อไปนี้ลงในไฟล์. m ของมุมมองก่อนหน้า
-(void)viewWillAppear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Back";
}
ในวิธีการเริ่มต้นของคุณเพิ่มรหัสต่อไปนี้:
- (id)initWithStyle:(UITableViewStyle)style {
if(self = [super init]) {
//...
UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
style:UIBarButtonItemStylePlain
target:self
action:@selector(goBack)];
self.navigationItem.leftBarButtonItem = customBackButton;
[customBackButton release];
//...
}
return self;
}
จากนั้นเพิ่มวิธีการง่าย ๆ เพื่ออนุญาตให้มีการยกเลิก viewview
-(void)goBack {
[self.navigationController popViewControllerAnimated:YES];
}
เพิ่มรหัสต่อไปนี้ใน viewDidLoad หรือ loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
ฉันทดสอบใน iPhone และ iPad ด้วย iOS 9
navigationController
และtopItem
คุณสมบัติเช่น:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
การเพิ่มคำตอบของบังเหียน หมายเหตุจากเอกสารของ Apple ที่ประกาศของbackBarButtonItemคือ:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
ดังนั้นคำตอบของ rein จะทำให้หน่วยความจำรั่วเพราะตัวตั้งค่าที่สังเคราะห์จะretain
เป็นอินสแตนซ์ที่คุณส่งผ่านซึ่งจะไม่ถูกปล่อยออกมาอย่างชัดเจน คุณสามารถแก้ไขได้โดยใช้autorelease
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStyleBordered
target:nil
action:nil] autorelease]; //<-- autoreleased
หรือคุณอาจชี้ตัวแปรไปที่อินสแตนซ์เพื่อให้คุณสามารถเผยแพร่ได้ในภายหลัง:
UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];
หวังว่านี่จะช่วยได้!
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];
}
ฉันค้นพบสิ่งที่น่าสนใจ หากคุณ subclass UINavigationController
และแทนที่pushViewController:animated:
วิธีและทำสิ่งนี้: (จำไว้ว่าฉันใช้ ARC)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @"Back"
style: UIBarButtonItemStyleBordered
target: nil action: nil];
viewController.navigationItem.backBarButtonItem = backButton;
[super pushViewController:viewController animated:animated];
จากนั้นสำหรับทุกสิ่งViewControllers
ที่ถูกผลักด้วยตัวควบคุมการนำทางของคุณจะมีปุ่ม "ย้อนกลับ" ในนั้นโดยอัตโนมัติ หากคุณต้องการเปลี่ยนข้อความสำหรับตัวควบคุมมุมมองบางตัวคุณสามารถลองและอาจส่งตัวควบคุมวิวไปยังคลาสที่แน่นอนหรือโปรโตคอลที่คุณกำหนดเองได้ (ซึ่งตัวควบคุมวิวเวอร์ของคุณสืบทอดมาซึ่งอาจมีวิธีเช่นbackButtonText
หรืออะไรทำนองนั้น) ข้อมูลบางอย่างเกี่ยวกับ viewcontroller ที่มาใน sothat คุณสามารถปรับแต่งข้อความปุ่มย้อนกลับได้ ตอนนี้ข้อความปุ่มย้อนกลับได้รับการดูแลในสถานที่ที่ควรรับผิดชอบ แต่เพียงผู้เดียว ฉันต้องยอมรับว่าการสร้างปุ่มใหม่เพื่อเปลี่ยนข้อความ sucks แต่ก็ดี
มีใครคิดบ้างไหมว่าทำไมไม่ทำอย่างนี้? อย่างน้อยคุณไม่ต้องเล่นซอกับชื่อ viewcontroller หรือต้องจำไว้ว่าให้สร้างปุ่มย้อนกลับใหม่ก่อนที่จะผลักดัน viewcontroller บนตัวควบคุมทิศทาง
คำตอบของบังเหียนทำงานได้ดี
โปรดทราบว่าหากคุณผลักดันตัวควบคุมมุมมองมากกว่าหนึ่งตัวชื่อของปุ่มย้อนกลับที่เปลี่ยนไปจะปรากฏขึ้นสำหรับแต่ละตัวควบคุมซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
ในกรณีดังกล่าวคุณจะต้องสร้าง UIBarButtonItem ที่กำหนดเองทุกครั้งที่คุณกดตัวควบคุมมุมมอง
นอกจากนี้ให้แน่ใจว่าคุณทำมันก่อนที่จะผลักดันตัวควบคุมมุมมองมิฉะนั้นคุณจะได้รับอาการสะอึกบนหน้าจอเป็นชื่อการเปลี่ยนแปลง
ตามข้อเสนอแนะของ Aubrey คุณสามารถทำได้ในตัวควบคุมมุมมองลูก:
สร้างตัวแปรสองตัวสำหรับเก็บค่าเก่าของ navigationItem.title ของพาเรนต์และ navigationItem ของพาเรนต์
UINavigationItem* oldItem;
NSString* oldTitle;
ในviewDidLoad
เพิ่มต่อไปนี้:
oldItem = self.navigationController.navigationBar.topItem;
oldTitle = oldItem.title;
[oldItem setTitle: @"Back"];
ในviewWillDisappear
เพิ่มต่อไปนี้:
[oldItem setTitle: oldTitle];
oldTitle = nil; // do this if you have retained oldTitle
oldItem = nil; // do this if you have retained oldItem
มันไม่สมบูรณ์แบบ คุณจะเห็นชื่อเรื่องของการเปลี่ยนแปลงมุมมองพาเรนต์เนื่องจากคอนโทรลเลอร์ใหม่มีการเคลื่อนไหว แต่สิ่งนี้จะบรรลุเป้าหมายของการติดฉลากแบบกำหนดเองที่ปุ่มย้อนกลับและทำให้มันมีรูปร่างเหมือนปุ่มย้อนกลับมาตรฐาน
ใส่สิ่งนี้ลงในตัวคุณviewDidLoad
โดยหวังว่ามันจะส่งผลต่อสิ่งที่คุณกำลังมองหา
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
ถ้าคุณต้องการตั้งชื่อใน ARRIVING controller (บางครั้งตรรกะมากกว่า .. ) ใน swift 3 ทำได้:
func setBackButtonNavBar(title: String, delay: Double){
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in
if let navBar = self.navigationController?.navigationBar{
navBar.backItem?.title = title
}
})
}
ในตัวควบคุมที่กำลังจะมาถึง:
override func viewDidLoad() {
super.viewDidLoad()
self.setBackButtonNavBar(title: "back", delay: 0.3)
}
ฉันมักจะใส่ self.setBackButtonNavBar ในส่วนขยายของตัวควบคุม
ฉันรู้ว่านี่เป็นคำถามเก่าและชนิดของคำตอบที่ได้รับการปรับปรุง!
วิธีง่ายๆในการทำเช่นนี้ในผู้ปกครอง ViewController:
เช่นที่จะนำคุณไปยังตัวควบคุมมุมมองถัดไป
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
UINavigationConroller
การทำเช่นนี้ในรหัสเอารูปแบบปุ่มด้านหลังของ StoryBoard
ถ้าคุณเพิ่มรายการนำทางในแต่ละมุมมองของคุณคุณสามารถตั้งชื่อของปุ่มย้อนกลับไปในที่
self.navigationController.navigationBar.topItem.title = @"Custom text";