ฉันจะเปลี่ยนชื่อของปุ่ม“ ย้อนกลับ” บนแถบนำทางได้อย่างไร


224

ปัจจุบันค่าเริ่มต้นของปุ่มแถบด้านซ้ายคือชื่อของมุมมองที่โหลดมุมมองปัจจุบันหรืออีกนัยหนึ่งมุมมองที่จะแสดงเมื่อกดปุ่ม (ปุ่มย้อนกลับ)

ฉันต้องการเปลี่ยนข้อความที่แสดงบนปุ่มเป็นอย่างอื่น

ฉันพยายามวางบรรทัดของรหัสต่อไปนี้ในวิธี viewDidLoad ของตัวควบคุมมุมมอง แต่ดูเหมือนจะไม่ทำงาน

self.navigationItem.leftBarButtonItem.title = @"Log Out";

ฉันควรทำอย่างไรดี?

ขอบคุณ

คำตอบ:


345

สิ่งนี้ควรอยู่ในวิธีการที่เรียก ViewController ชื่อว่า "NewTitle" ขวาก่อนคำสั่ง push หรือ popViewController

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

47
เมื่ออยู่ในตัวควบคุมมุมมองลูกการเรียกสิ่งนี้จากตัวควบคุมมุมมองลูกจะไม่ทำงาน คุณต้องเรียกสิ่งนี้จากคอนโทรลเลอร์มุมมองพาเรนต์ขณะที่อยู่ในคอนโทรลเลอร์มุมมองลูก
Alex Reynolds

2
ในการเปลี่ยนปุ่มย้อนกลับสำหรับตัวควบคุมมุมมองระดับที่สามของฉัน (การกดครั้งที่สอง) ฉันต้องใช้บรรทัดต่อไปนี้แทนคำตอบด้านบน: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; ฉันกำลังทำอะไรผิดหรือเปล่า?
JonB

4
จอร์แดนบอกว่าเขา "[เพิ่มเติม] ความชัดเจนมากขึ้นเล็กน้อยว่าจะวางรหัสไว้ที่ใด" นี่คือความชัดเจนที่มากยิ่งขึ้น: ใส่ไว้ในคอนโทรลเลอร์ตัวแรก (หรือที่รู้จักกันว่า parent) ทันทีก่อนที่จะมีการเรียกเพื่อผลักดันคอนโทรลเลอร์ตัวที่สอง (aka child)
benvolioT

1
คุณสามารถสร้าง BaseViewController ที่กำหนดเองและใส่ลงใน-viewDidLoad:
Art รู้สึก

2
คุณไม่ต้องทำสิ่งนี้ก่อนผลักหรือป๊อป คุณสามารถทำได้ใน viewDidLoad หรือ loadView หรือที่ใดก็ตามที่คุณตั้งชื่อและคุณสมบัติอื่น ๆ สำหรับมุมมองนี้ คำตอบของ Victor Bogdan ด้านล่างนั้นชัดเจนกว่า IMHO
Joe Strout

98

ใน ChildVC สิ่งนี้ทำงานได้สำหรับฉัน ...

self.navigationController.navigationBar.topItem.title = @"Back";

ทำงานใน Swift ด้วย!

self.navigationController!.navigationBar.topItem!.title = "Back"

4
ทดสอบและตรวจสอบบน iOS 7 ใน Xcode 5.0.2 WILL นี้จะเปลี่ยนชื่อของหน้าจอก่อนหน้าเป็น Back เมื่อคุณกลับไปที่หน้าจอเดิม
Alex Zavatone

ทางออกที่ง่ายที่สุด ทำงานได้ทั้งบน iOS 6 และ 7 ใส่ UIViewController พื้นฐานและทำ ดีกว่าโซลูชัน IB หรือการตั้งค่าใน vc แบบพุช
Eric Chen

46
มันเปลี่ยนชื่อของตัวควบคุมมุมมองก่อนหน้านั่นคือปัญหาในการแก้ปัญหานี้
Nikita

2
@Nikita คุณสามารถตั้งค่าไทล์กลับในมุมมอง Willisappear
Dan Beaulieu

81

นี่คือเอกสารสำหรับbackBarButtonItem :

"เมื่อรายการการนำทางนี้อยู่ต่ำกว่ารายการบนสุดในกองซ้อนตัวควบคุมทิศทางจะได้รับปุ่มย้อนกลับสำหรับแถบนำทางจากรายการนำทางนี้ [... ] หากคุณต้องการระบุภาพหรือชื่อที่กำหนดเองสำหรับปุ่มย้อนกลับ คุณสามารถกำหนดรายการปุ่มแถบที่กำหนดเอง (ด้วยชื่อหรือรูปภาพที่กำหนดเอง) ให้กับคุณสมบัตินี้แทน "

ดูคอนโทรลเลอร์A ( ตัวควบคุมมุมมอง"พาเรนต์" ):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

เมื่ออื่น ๆ มุมมองควบคุมBอยู่ด้านบนของสแต็คนำทางและเป็นสิทธิด้านล่างB 's ปุ่มย้อนกลับจะมีชื่อ'สั้น'


4
ส่วนที่ยากคือคุณต้องตั้งปุ่มย้อนกลับในตัวควบคุมมุมมอง PARENT ไม่ใช่มุมมองลูก เสียเวลาเพียงแค่คิดออก
Merkurial

56

ใน Xcode 4.5 โดยใช้สตอรี่บอร์ดโดยวิธีที่ง่ายที่สุดที่ฉันพบเมื่อค่าของปุ่มย้อนกลับไม่จำเป็นต้องเปลี่ยนแบบไดนามิกคือการใช้ฟิลด์ "ปุ่มย้อนกลับ" ที่เกี่ยวข้องกับรายการการนำทางของตัวควบคุมมุมมองที่คุณ ต้องการปุ่ม "ย้อนกลับ" เพื่อพูดอย่างอื่น

เช่นในภาพหน้าจอด้านล่างฉันต้องการปุ่มย้อนกลับสำหรับตัวควบคุมมุมมองที่ฉันกดเพื่อให้มี "ย้อนกลับ" เป็นชื่อเรื่องของปุ่มย้อนกลับ

ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนว่ามันจะไม่ทำงานถ้าคุณต้องการปุ่มย้อนกลับเพื่อพูดอะไรที่แตกต่างออกไปเล็กน้อยในแต่ละครั้ง ... มีวิธีแก้ปัญหาอื่น ๆ ทั้งหมดที่นี่


คำถามดั้งเดิมไม่ได้พูดอะไรเกี่ยวกับการใช้สตอรีบอร์ดดังนั้นจึงเป็นเรื่องดีที่นี่ไม่ใช่คำตอบที่ได้รับการยอมรับ
villapossu

42

ฉันรู้ว่าคำถามเก่ามาก แต่ฉันพบทางออกที่ดี

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

ทำงานจาก childView! ทดสอบกับ iOS 7


ดูเหมือนว่าจะใช้งานได้เพียงระดับเดียวเท่านั้น มันไม่ทำงานสำหรับเด็กที่เป็นเด็กของฉัน iOS 8
narco

26

บางทีฉันอาจจะดูเรียบง่าย แต่จากเอกสารของ Apple ถ้อยคำคือ:

หากไม่ได้ระบุรายการปุ่มแถบที่กำหนดเองโดยตัวควบคุมมุมมองปุ่มย้อนกลับเริ่มต้นจะถูกใช้และชื่อเรื่องของมันถูกตั้งค่าเป็นค่าของคุณสมบัติหัวเรื่องของตัวควบคุมมุมมองก่อนหน้านั่นคือตัวควบคุมมุมมองหนึ่งระดับลง กองซ้อน

โซลูชันที่ทำเครื่องหมายถูกต้องด้านบนตั้งค่ารายการปุ่มเริ่มต้นจากตัวควบคุมหลัก มันเป็นคำตอบที่ถูกต้อง แต่ฉันแก้ปัญหาด้วยการเปลี่ยนself.titleคุณสมบัติของ UIViewController ทันทีก่อนที่จะส่งคอนโทรลเลอร์ใหม่ไปยังสแต็ค NavigationController

สิ่งนี้จะอัปเดตชื่อปุ่มย้อนกลับบนตัวควบคุมถัดไปโดยอัตโนมัติและตราบใดที่คุณตั้งค่าself.titleกลับไปเป็นสิ่งที่ควรจะเป็นviewWillAppearฉันไม่เห็นวิธีนี้ทำให้เกิดปัญหามากเกินไป


19

งานนี้ดีกว่าสำหรับฉัน ลอง :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

19

ใน Swift / iOS8 การทำงานต่อไปนี้สำหรับฉัน:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

ส่งจากคำตอบของเฟลิเป้


ไวยากรณ์ของ swift 1.1 คือself.navigationController?.navigationBar.topItem?.backBarButtonItem
Warren Burton

3
สไตล์ควรเป็น UIBarButtonItemStyle.Plain
Micro

2
ขอบคุณสำหรับสิ่งนี้. นี่คือ API ที่น่าสมเพชอย่างแท้จริง และตัวแทนของ UIKit โดยทั่วไป ระหว่างแถบการนำทางและแถบสถานะใน iOS เป็นสิ่งที่น่าแปลกใจที่เรายังคงพัฒนาสำหรับแพลตฟอร์มที่น่าเกรงขาม ขอบคุณพระเยซูที่รักสำหรับ Stack Overflow และผู้มีส่วนร่วม!
Womble

@Wobmle: คุณควรพัฒนาสำหรับ Android สองสามเดือน;)
fl034

17

ตกลงนี่คือวิธี หากคุณมีตัวควบคุมมุมมอง "แรก" และคุณนำทางตัวควบคุมมุมมองอื่น "ที่สอง" โดยการกดปุ่มหรืออื่น ๆ คุณต้องทำงานบางอย่าง ก่อนอื่นคุณต้องสร้าง BarButtonItem ในวิธีที่สอง "View" ของตัวควบคุม ViewDidLoad เช่นนี้

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

หลังจากที่คุณทำเช่นนั้นคุณจะต้องเขียนรหัสสำหรับการกระทำ "btnBack" ในไฟล์. m เดียวกันเช่นนี้

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

นั่นคือทั้งหมดที่


2
A leftBarButtonItemไม่มีลักษณะของ a backBarButtonItem, หากสิ่งนั้นมีความสำคัญในการออกแบบแอปพลิเคชัน
Alex Reynolds

1
จากวิธีแก้ปัญหาที่โพสต์ (ขอบคุณมาก) สิ่งนี้ดูเหมือนว่าจะใช้ได้แม้ว่า Alex จะระบุไว้ข้างต้นปุ่มแถบด้านซ้ายจะไม่ดูเหมือนรายการด้านหลัง ฉันจะทำให้มันดูเหมือนเป็นรายการด้านหลังได้อย่างไร ???
Dale

17

ฉันมีตัวควบคุมมุมมองผู้ปกครองที่มีชื่อยาวมาก ซึ่งส่งผลให้ข้อความปุ่มย้อนกลับมีเลือดออกในชื่อของตัวควบคุมมุมมองเด็ก

หลังจากลองใช้วิธีแก้ปัญหาต่าง ๆ นี่คือสิ่งที่ฉันทำลงไป (ขยายใน @ john.k.doe):

ใช้ Xcode 7.2, Swift 2

  1. ใน Storyboard เพิ่ม a Navigation ItemไปยังฉากParent View Controller (ไม่ใช่ child VC)

รายการนำทาง

  1. ที่Attributes Inspectorใหม่ของคุณNavigation Itemพิมพ์spaceตัวละครในBack Buttonสนาม เพิ่มเติมเกี่ยวกับเรื่องนี้ในภายหลัง

รายการการนำทางในมุมมองลำดับชั้น

เพิ่มอักขระเว้นวรรคลงในฟิลด์ปุ่มย้อนกลับ

  1. ในการปกครองควบคุมดูเพิ่มรหัสต่อไปนี้:

ข้อมูลโค้ด:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

คำอธิบาย:

การเรียงลำดับปุ่มย้อนกลับเป็นของตัวควบคุมมุมมองหลัก หมายเลขNavigation Itemช่วยให้คุณจัดการกับปุ่มย้อนกลับเพื่อให้คุณสามารถตั้งชื่อในรหัสหรือในกระดานเรื่องราว

บันทึก:

หากคุณปล่อยให้Navigation Item Back Buttonข้อความเป็นสตริงว่างเริ่มต้นชื่อปุ่มย้อนกลับจะกลายเป็น "ย้อนกลับ"

วิธีอื่น ๆ ใช้งานทำไมจึงใช้วิธีนี้:

ในขณะที่เป็นไปได้ที่จะแทนที่ชื่อปุ่มย้อนกลับบนตัวควบคุมมุมมองลูกมันเป็นความท้าทายที่ได้รับการจัดการไปจนถึงมันได้กระพริบสั้น ๆ บนหน้าจอ

วิธีการบางอย่างสร้างปุ่มย้อนกลับใหม่และแทนที่ปุ่มเดิมที่มีอยู่ ฉันแน่ใจว่าใช้งานได้และอาจจำเป็นในบางกรณี แต่ฉันต้องการใช้ประโยชน์ API ที่มีอยู่เมื่อเป็นไปได้

การเปลี่ยนtitleคอนโทรลเลอร์มุมมองพาเรนต์เป็นวิธีแก้ปัญหาที่เร็วที่สุดสำหรับบางสถานการณ์ อย่างไรก็ตามสิ่งนี้จะเปลี่ยนชื่อพาเรนต์ดังนั้นคุณต้องจัดการสถานะ สิ่งต่าง ๆ ก็ยุ่งเหยิงTab Bar Controllerเพราะการเปลี่ยนชื่อทำให้เกิดผลข้างเคียงกับTab Bar Itemชื่อ


10

สำหรับผู้ที่ใช้สตอรี่บอร์ดให้เลือกพาเนลตัวควบคุม (ไม่ใช่มุมมองเป้าหมาย) เฟรมตัวควบคุม (ให้แน่ใจว่าคุณคลิกขวาที่แถบการนำทางจากนั้นเปิดตัวตรวจสอบแอททริบิวต์ซึ่งคุณจะพบอินพุตสามแบบ ปุ่มย้อนกลับ "คือสิ่งที่เรากำลังมองหา


4
นี่เป็นทางออกที่ดีที่สุดถ้าคุณไม่สนใจเกี่ยวกับการแปล
MiQUEL

7

รุ่น Swift:

ใน ViewController ลูกของคุณ:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}

สิ่งนี้จะเปลี่ยนหัวเรื่องของตัวควบคุมมุมมองก่อนหน้าในสแต็กเป็น "TEXT" ซึ่งน้อยกว่าอุดมคติ
gravitron

6

นี่เป็นอีกวิธีในการทำ

ในตัวควบคุมมุมมองพาเรนต์ของคุณให้ใช้วิธีการต่อไปนี้:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

ในตัวควบคุมมุมมองลูกของคุณเมื่อคุณต้องการเปลี่ยนชื่อสิ่งนี้จะทำงาน:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

ฉันไม่สามารถรับparentViewControllerทรัพย์สินให้ทำงานได้:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

ฉันไม่ทราบว่าเป็นข้อผิดพลาดหรือไม่ได้ใช้อย่างถูกต้อง แต่การจับตัวควบคุมมุมมองที่สองไปยังจุดสุดท้ายในviewControllersอาเรย์ชี้ไปที่ตัวควบคุมมุมมองพาเรนต์และฉันสามารถเรียกเมธอดพาเรนต์อย่างถูกต้องด้วยการอ้างอิงนั้น


6

ตกลง. ฉันเกลียดตัวเลือกทั้งหมดเหล่านี้เป็นการส่วนตัว ดังนั้นฉันมากับตัวเอง

จากข้อมูลที่ฉันได้เห็น ปรากฏว่าตัวควบคุมมุมมองก่อนหน้านี้อยู่ในการควบคุมของปุ่ม "ย้อนกลับ" ของตัวเองที่จะนำเสนอบนตัวควบคุมมุมมองผลักดัน

ฉันสร้างวิธีการโหลดขี้เกียจสำหรับ NavigationItem บนตัวควบคุมที่ต้องการเปลี่ยนปุ่มย้อนกลับ

ฉันเป็นผู้ควบคุมผู้ซื้อเชิญ

คำเชิญผู้ซื้อคือข้อความที่ตั้งค่าไว้

แต่ปุ่มย้อนกลับจำเป็นต้องได้รับเชิญ

นี่คือรหัสที่ฉันใช้ในการสร้างปุ่มย้อนกลับ

ฉันวางโค้ดนี้ไว้ที่ด้านบนของไฟล์ Implementatio (.m) ของคอนโทรลเลอร์และมันจะแทนที่เมธอดของ super โดยอัตโนมัติ

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

ฉันรู้สึกว่านี่เป็นวิธีที่ยอดเยี่ยมกว่ามากในการทำสิ่งนี้ให้สำเร็จ

ฉันวางรหัสนี้ในที่เดียวและจะได้รับการเติมโดยอัตโนมัติเมื่อจำเป็น

ไม่จำเป็นต้องโทรหารหัสก่อนที่จะส่งคำขอแต่ละครั้ง

หวังว่านี่จะช่วยได้


5
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

5

นี่คือคำตอบ:

ในviewDidAppear:animated(ไม่ค่ะviewDidLoad ) ให้ทำดังนี้

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

ซึ่งหากว่าคุณต้องการที่จะรักษารูปร่างของปุ่มย้อนกลับ


ไม่เลวเลยยกเว้นว่าพวกเขาจะเห็นมันเปลี่ยนชื่อ ฉันพยายามใน viewWillAppear และมันไม่ทำงาน
Travis M.

5

ไม่มีวิธีแก้ไขที่อธิบายไว้ที่นี่สำหรับฉัน ดังนั้นสิ่งที่ฉันทำคือลบชื่อออกจากฉากที่ฉันมาด้วยวิธีต่อไปนี้:

self.title = @"";

ดังนั้นเมื่อมีการนำเสนอฉากใหม่ข้อความด้านหลังจึงไม่ปรากฏ

ฉันเห็นด้วยอย่างแน่นอนว่านี่ไม่ใช่วิธีการแก้ปัญหาที่ชัดเจน แต่ทำงานได้และไม่มีคำอธิบายใดที่เหมาะกับฉัน


ผู้ชายฉันต้องบอกคุณว่ามันเป็นปี 2017 และยังคงเป็นความเจ็บปวดใน a $ เพื่อจัดการกับปุ่มย้อนกลับ วิธีการของคุณใช้ได้กับฉันและฉันก็ลงเอยด้วยเครื่องหมาย "<" ถึงแม้ว่าฉันต้องการคำว่า "ยกเลิก" แต่ฉันจะจัดการกับสิ่งที่ฉันได้รับ :)
AnBisw

5

ฉันพบว่ามันเป็นการดีที่สุดที่จะเปลี่ยนชื่อของตัวควบคุมมุมมองปัจจุบันในกองการนำทางเป็นข้อความที่ต้องการของปุ่มย้อนกลับก่อนที่จะผลักดันไปยังตัวควบคุมมุมมองต่อไป

ตัวอย่างเช่น

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

จากนั้นใน viewDidAppear ตั้งชื่อกลับเป็นชื่อที่ต้องการสำหรับ VC ต้นฉบับ Voila!


5

สำหรับ Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton

4

ฉันพบว่าวิธีที่ง่ายที่สุดในการเปลี่ยนชื่อของปุ่มย้อนกลับคือการตั้งชื่อตัวควบคุมมุมมองเป็นชื่อเรื่องของปุ่มย้อนกลับจากนั้นแทนที่ TitleView ในรายการนำทางตัวควบคุมมุมมองเป็นป้ายกำกับแบบกำหนดเองด้วยจริง ชื่อ.

แบบนี้:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

สิ่งนี้จะทำให้ชื่อของคุณใน UINavigationBar ดูเหมือนกับชื่อจริง ให้ตัวควบคุมมุมมองมีความสามารถในการแยกหัวเรื่องและชื่อปุ่มย้อนกลับ

ในกรณีของตัวควบคุมมุมมอง A และ B A รับผิดชอบในการบอกว่าปุ่มย้อนกลับควรดูอย่างไรในขณะที่ B แสดงขึ้น

แก้ไข: นี่ยังรักษารูปลักษณ์ดั้งเดิมของปุ่มย้อนกลับ (รายการปุ่มแถบลูกศรซ้าย)


4

รหัสนี้ใช้ได้เช่นกัน วางสิ่งนี้ลงบนรูทคอนโทรลเลอร์ของตัวควบคุมทิศทาง

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

4

ฉันใหม่ใน iOS แต่ฉันจะให้คำตอบง่ายๆของการเอาชนะคลาสตัวควบคุมการนำทาง ฉันมีวิธีการแทนที่แบบพุชและป๊อปอย่างง่ายและบันทึกหัวเรื่องของคอนโทรลเลอร์มุมมองก่อนหน้า ขออภัยที่วางในบล็อก js สับสนเล็กน้อยว่าจะผ่านมันไปอย่างไรในบล็อครหัสปกติ

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end


4

self.navigationController.navigationBar.backItem.title = @"TEXT";

และใน Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"

3
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

คุณสามารถวางไว้ในที่ใดก็ได้ที่คุณต้องการในรหัสในตัวควบคุม parrent ซึ่งอนุญาตให้คุณมีปุ่มย้อนกลับต่างกันสำหรับมุมมองลูกที่แตกต่างกัน


3

โซลูชันส่วนใหญ่จะฆ่ารูปแบบดั้งเดิมของ BackButton (ปุ่มแถบลูกศรซ้าย) ขณะที่เพิ่มปุ่มปกติพร้อมชื่อที่ต้องการ
ดังนั้นเพื่อรักษาสไตล์ดั้งเดิมไว้มี 2 วิธี:
ลำดับที่ 1: การใช้รูปแบบปุ่มที่ไม่มีเอกสาร (110 หรืออะไรทำนองนั้น) ที่ฉันไม่ชอบทำ แต่ถ้าคุณต้องการคุณสามารถหาวิธีการทำได้ที่นี่ใน stackoverflow
2nd: เพื่อใช้ไอเดียของ Trenskow ฉันชอบมันและฉันใช้มันเปลี่ยนไปเล็กน้อย
แทนที่จะเขียนทับ - (NSString *) หัวเรื่องฉันตัดสินใจเก็บชื่อดั้งเดิมด้วยวิธีต่อไปนี้ (ซึ่งทำให้ฉันสามารถใช้ชื่อเรื่องของปากกาได้เช่นเดียวกับชื่อที่กำหนดที่ push state btw)

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

วิธีนี้ใช้งานได้ดีและดูพื้นเมือง นอกจากนี้หากใช้ในวิธี viewDidLoad จะป้องกันไม่ให้มีการดำเนินการมากกว่า 1 ครั้ง
นอกจากนี้ฉันได้ลองวิธีการแก้ปัญหาของ Jessedc แต่มันก็ดูไม่ดี มันทำให้มองเห็นแถบชื่อผู้ใช้เปลี่ยนได้ทันทีจากเดิมเป็น BackButton ที่ต้องการและย้อนกลับ


2

สิ่งนี้ใช้ได้กับฉันในฐานะที่เป็น "คำตอบแบบง่าย" ของคำตอบที่โพสต์ก่อนหน้านี้

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

จำไว้ว่าให้วางรหัสไว้ในตัวควบคุมมุมมองพาเรนต์ (เช่นมุมมองที่มีมุมมองตารางหรือ UITableViewController) ไม่ใช่มุมมองลูกหรือมุมมองรายละเอียด (เช่น UIViewController)

คุณสามารถ จำกัด วงสตริงปุ่มย้อนกลับได้ดังนี้

backButton.title = NSLocalizedString(@"Back Title", nil);

2

เรามี VC และ A ของ B สองตัว

หากคุณต้องการเปลี่ยนชื่อใน B ให้เขียนรหัสนี้ใน A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)

1

คำตอบของสแตนเป็นคำตอบที่ดีที่สุด แต่มันก็มีปัญหาเมื่อคุณใช้ตัวควบคุมด้วย Tab Bar และเปลี่ยนชื่อของตัวควบคุมคุณสามารถเปลี่ยนชื่อของ Tab Bar ได้เช่นกันดังนั้นคำตอบที่ดีที่สุดคือเปลี่ยน view_controller.navigationItem.title เท่านั้นและใช้ view_controller.navigationItem .title ในฟังก์ชั่น คำตอบอยู่ที่นี่: (ด้วย ARC และเพิ่มลงใน viewDidLoad ของมุมมอง)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

ในการใช้งานของตัวเองฉันทำให้ฟังก์ชั่นเช่นนี้มีคุณสมบัติด้วยรหัสบรรทัดเดียวใน viewDidLoad

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}

1

หากคุณต้องการไม่เพียง แต่จะเปลี่ยนข้อความของปุ่มย้อนกลับไปยังข้อความเดียวกันและยังคงรูปทรงลูกศรซ้ายเดิม แต่ยังจะทำอะไรเมื่อผู้ใช้คลิกปุ่ม Back, ผมขอแนะนำให้คุณได้ดูรอบ ๆ ของฉัน "ซึ่งเป็นCustomNavigationController " .


1

ปัญหา: ข้อความ "ย้อนกลับ" ในแถบนำทางไม่สามารถแทนที่ได้

เหตุผล: ป้ายกำกับ "ย้อนกลับ" ถูกตั้งค่าในแถบการนำทางหลังจากกดมุมมองเนื่องจากแอตทริบิวต์ .title ในตัวควบคุมมุมมองหลักถูกตั้งค่าเป็นศูนย์ (หรือไม่เริ่มต้น)

แนวทางแก้ไขปัญหาเดียว: หากคุณตั้งค่า self.title = "อะไรก็ตาม ... " คุณจะเห็นว่าแทนที่จะเป็น "ย้อนกลับ" จะปรากฏเป็น "อะไรก็ตาม ... " หลังจากกดตัวควบคุมมุมมองใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.