การลบข้อความหัวเรื่องของ iOS UIBarButtonItem


198

สิ่งที่ฉันต้องการทำคือการลบข้อความออกจากปุ่ม 'ย้อนกลับ' ของ a UIBarButtonItemโดยเหลือเพียงเครื่องหมายบั้งสีน้ำเงินบนแถบนำทาง โปรดทราบว่าฉันกำลังพัฒนาสำหรับ iOS 7 ฉันได้ลองวิธีการหลายวิธีรวมถึง แต่ไม่ จำกัด เฉพาะ:

นี่เป็นวิธีภาพที่ฉันไม่ชอบ (ภาพดูผิดที่):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

วิธีอื่นที่ฉันลองใช้คือสิ่งนี้ซึ่งใช้ไม่ได้ (ไม่มีอะไรปรากฏ):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

สิ่งที่ฉันต้องการบรรลุคือปุ่มย้อนกลับที่พบในแอปเพลง iOS 7 ซึ่งมีเพียงรูปตัววีเดียว

ขอบคุณ


ดูคำตอบนี้stackoverflow.com/a/20300577/1589731
ayalcinkaya

ทำไมคุณไม่ถ่ายภาพสิ่งที่คุณต้องการ และอ้างอิงใน leftBarButtonItem
Vishal Sharma

เหตุผลที่ฉันไม่ได้ใช้วิธีภาพคือ 1. มันยากมากที่จะได้ภาพที่สมบูรณ์แบบของปุ่มย้อนกลับและ 2. จะมีการจัดแนวที่ไม่ตรงกับรูปแบบและมันดูไม่เป็นธรรมชาติ ฉันไปที่ StackOverflow เพื่อขอความช่วยเหลือเกี่ยวกับวิธีการทำสิ่งนี้ให้สำเร็จ
Pan Ziyue

คำตอบ:


198
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

จากนั้นคุณสามารถลบชื่อรายการปุ่มย้อนกลับ

หากคุณใช้สตอรีบอร์ดคุณสามารถตั้งค่าตัวตรวจสอบการนำทางคุณลักษณะปุ่มย้อนกลับพร้อมช่องว่าง


95
มีปัญหาเกี่ยวกับชื่อที่มีขนาดใหญ่คือพวกเขาจะไม่เป็นศูนย์กลาง แต่ผลักไปทางขวาเช่นถ้าข้อความปุ่มย้อนกลับยังคงมี
sonxurxo

11
สิ่งนี้จะไม่ทำงานหากผู้ใช้เปิด "การเข้าถึง - รูปร่างปุ่ม"
Mikael Bartlett

22
ฉันคิดว่านี่เป็นคำตอบที่ดีกว่า:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
เบ็นจามิน

19
ทางออกใด ๆ ที่มีตัวเลขเวทย์มนตร์อยู่ในนั้นเป็นความคิดที่ไม่ดี ด้วยการพุชไปที่การจ่ายอัตโนมัติ, คลาสขนาด, คุณสมบัติการเข้าถึงได้ง่าย ฯลฯ โดยใช้ค่าคงที่เช่นนี้คุณจะถูกกัด
Michael Peterson

3
เพื่อปรับปรุงความคิดเห็นของเบนจามินคุณควรตั้งค่านี้UIControlStateHighlightedเช่นกัน
n_b

411

ในการตั้งชื่อปุ่มย้อนกลับสำหรับตัวควบคุมมุมมองโดยไม่เปลี่ยนการใช้หัวเรื่อง:

Objective-C:

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

สวิฟท์:

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

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


1
ฉันไม่รู้ว่าทำไมคำตอบอื่น ๆ ถูกทำเครื่องหมายว่าถูกต้องเพียงลบชื่อเพื่อให้ปุ่มย้อนกลับมี "ชื่อ" เพื่อแสดง แต่นั่นไม่ใช่วิธีที่ถูกต้องเลย! อันนี้ควรเป็นคำตอบที่ถูก
Pach

8
นอกจากนี้สำหรับทุกคนที่ใช้ Swift ก็คือ navigationItem.backBarButtonItem = UIBarButtonItem (ชื่อเรื่อง: "", สไตล์: .Plain, เป้าหมาย: nil, action: nil) ไม่ใช่เรื่องยากที่จะแปลงจาก Obj-C ถึง Swift แต่ฉันจะช่วยคุณแก้ปัญหาได้
Zoyt

15
@BenjaminPiette คุณเรียกสิ่งนี้บน UIViewController ว่าคุณจะเห็นว่าคุณกดปุ่มย้อนกลับหรือไม่? ไม่ใช่ UIViewController ที่แสดงปุ่มย้อนกลับ
DonnaLea

2
ช่างเป็นทางออกที่ดีเลิศ! ขอบคุณ มันรู้สึกไม่ถูกต้องที่จะทำสิ่งชดเชย
hyd00

2
โซลูชันนี้ทำงานได้สมบูรณ์แบบหากคุณเขียนโค้ดบรรทัดนี้ลงบนคอนโทรลเลอร์ก่อนหน้าในการนำทางสแต็ก
Bohdan Savych

128

หากคุณใช้สตอรีบอร์ดคุณสามารถไปAttributes Inspectorที่ ViewController Navigation Item(คลิกที่Navigation Bar) และตั้งค่าBack Buttonคุณสมบัติเป็น "" (อักขระช่องว่างหนึ่งช่อง) สิ่งนี้จะตั้งค่าชื่อปุ่มย้อนกลับเป็นอักขระเว้นวรรคหนึ่งตัวทำให้มองเห็นเครื่องหมายบั้งได้ ไม่จำเป็นต้องยุ่งกับรหัส

ภาพตัวอย่าง

โปรดทราบว่าสิ่งนี้จะตั้งBack Buttonชื่อสำหรับปุ่มย้อนกลับที่จะแยกไปที่ View Controller นี้จากที่ถูกผลักไปด้านบนไม่ใช่สำหรับBack Buttonที่จะปรากฏในตัวควบคุมนี้!


10
ฉันหวังว่าฉันจะสามารถโหวตได้มากกว่านี้: "โปรดทราบว่าสิ่งนี้จะตั้งค่าชื่อปุ่มย้อนกลับสำหรับปุ่มย้อนกลับที่จะแยกไปยังมุมมองตัวควบคุมนี้ในรูปแบบที่ถูกผลักไว้ด้านบนไม่ใช่ปุ่มย้อนกลับที่จะแสดงภายในนี้ ควบคุม!"
Jayson Lane

121

วิธีนี้ใช้ได้ผลสำหรับฉันที่จะแสดงเครื่องหมายบั้ง 'ย้อนกลับ' โดยไม่มีข้อความใด ๆ :

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

ตั้งค่าคุณสมบัตินี้ในviewDidLoadView Controller นำเสนอแถบการนำทางและจะทำเคล็ดลับ

หมายเหตุ: ฉันได้ทดสอบเฉพาะใน iOS 7 ซึ่งอยู่ภายในขอบเขตของคำถาม


33
ที่มีผลข้างเคียงของการลบป้ายกำกับชื่อที่อยู่ตรงกลางของแถบนำทาง
Pwner

7
ตั้งชื่อของการผลักดัน VC บน 'viewWillAppear' ด้วยคุณสมบัติเดียวกัน วิธีนี้จะไม่ถูกลบออก
Guto Araujo

5
ฉันย้ายรหัสชิ้นส่วนนั้นไป-viewDidLoadยัง VC ที่ฉันไม่ต้องการให้ข้อความย้อนกลับ อย่างไรก็ตามสิ่งที่ฉันค้นพบในภายหลังคือเมื่อฉันปรากฏ VC ครั้งที่ 2 จากnavigationControllerข้อความชื่อเรื่องปรากฏขึ้นหลังจากนั้นไม่นาน ฉันเดาว่าวิดีโอน่าจะอธิบายสิ่งนี้ได้ดีกว่าดังนั้นที่นี่คือ: ลิงค์
Pan Ziyue

1
นี่ไม่ใช่คำตอบที่ดีที่สุดโปรดอ้างถึงคำตอบของ andyleehao: [[ลักษณะ UIBarButtonItem] setBackButtonTitlePositionAdjustment: UIOffsetMake (0, -60) สำหรับ BarMetrics: UIBarMetricsDefault];
lmnbeyond

1
นี่คือคำตอบที่ถูกต้องตามเอกสารของ Apple: "เมื่อผู้รับอยู่ในรายการการนำทางและเป็นอันดับที่สองจากคำกล่าวอีกนัยหนึ่งตัวควบคุมมุมมองของมันจะจัดการมุมมองที่ผู้ใช้จะนำทางกลับไป - ค่าในคุณสมบัตินี้ ใช้สำหรับปุ่มย้อนกลับบนแถบนำทางด้านบนสุดหากค่าของคุณสมบัตินี้เป็นศูนย์ระบบจะใช้สตริง“ ย้อนกลับ” เป็นข้อความของปุ่มย้อนกลับ "
Raphael Oliveira

27

เมื่อคุณตั้งชื่อปุ่มให้ใช้ @ "" แทน @ ""

--EDIT--

มีอะไรเปลี่ยนแปลงเมื่อคุณลองใช้สายอื่นหรือไม่? ฉันใช้รหัสต่อไปนี้สำเร็จแล้ว:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString เป็นตัวแปรที่กำหนดเป็น @ "" หรือ @ "Back" ขึ้นอยู่กับว่าฉันใช้ iOS 7 หรือรุ่นต่ำกว่า

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


อืม iOS 7 ดูเหมือนจะไม่เปลี่ยนแปลง มันยังคงใช้ "Back" เป็นชื่อ ถ้าฉันใส่setLeftBarButtonItem:backButtonแทนไม่มีอะไรจะอยู่ที่นั่น
Pan Ziyue

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

27

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

บางครั้งการเห็นสิ่งต่าง ๆ ในบริบทเป็นประโยชน์ นี่คือโปรเจ็กต์ขนาดเล็กที่ซ่อนข้อความ "ย้อนกลับ" แต่ยังคงแสดงลูกศร

สตอรี่บอร์ด

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

มีการแสดงรายการแยกจากปุ่ม "แสดงตัวควบคุมมุมมองที่สอง" ไปยังตัวควบคุมมุมมองที่สอง

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

รหัส

FirstViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

วิธีสำรอง (IB เท่านั้นไม่มีรหัส)

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

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


แนวคิดหลักที่ว่า "สำหรับตัวควบคุมมุมมองแรก (ไม่ใช่ตัวที่สอง)" ตามที่เป็นชื่อของ VC ที่คุณต้องการกลับมาดังนั้นจึงเป็นความรับผิดชอบในการตั้งชื่อเรื่องนี้
buguibu

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

1
คุณสามารถใช้ backItem แทน topItem TopItem จะซ่อนหัวเรื่องในขณะที่ backItem จะซ่อนชื่อปุ่มย้อนกลับ
Ravi Ojha

2
นี่เป็นทางออกเดียวหาก childViewController อยู่ที่ระดับความลึก 2+ ในกลุ่มลูกของ NavigationController
Nathaniel Blumer

2
นี่จะเป็นการเอาชื่อของตัวควบคุมมุมมองก่อนหน้าออกด้วย ในกรณีส่วนใหญ่นี่คือการดูด
CalZone

11

บน iOS7, Apple แนะนำคุณสมบัติใหม่สองรายการแก่ UINavigationBar, 'backIndicatorTransitionMaskImage' และ 'backIndicatorImage'

เพียงโทรครั้งเดียว:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

มันจะแสดงภาพที่กำหนดเองแทนสัญลักษณ์รูปตัววีเริ่มต้นสืบทอดสีโทนสีของ keyWindow

และสำหรับการลบชื่อฉันจะแนะนำคำตอบของ Kamaros อย่าลืมเรียกรหัสนี้ในตัวควบคุมมุมมองที่ผลักดันตัวควบคุมมุมมองใหม่ของคุณ การลบข้อความหัวเรื่องของ iOS UIBarButtonItem


ในการปรับสีอ่อน [[ลักษณะที่ปรากฏของ UINavigationBar] setTintColor: [UIColor whiteColor]];
Mazen Kasser

10

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


10

สิ่งนี้ใช้ได้กับฉันใน iOS10 เรียกสิ่งนี้จาก viewDidLoad ของคอนโทรลเลอร์มุมมอง

self.navigationController?.navigationBar.topItem?.title = ""

6

วิธีง่ายๆในการแก้ไขปัญหานี้ทำงานบน iOS7 และ 6 คือการตั้งค่ามุมมองหัวเรื่องที่กำหนดเองใน viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

จากนั้นใน viewWillAppear: คุณสามารถโทรได้อย่างปลอดภัย

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

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


ฉันต้องการเฉพาะส่วนหลังของรหัสไม่ใช่ UILabel ที่ว่างเปล่า ฉันโทร[self.navigationItem.backBarButtonItem setTitle:@" "];ใน viewWillAppear แต่มันไม่ได้ทำงานกับมุมมองที่นำเสนอหลังจากยกเลิกมุมมองที่เป็นกิริยาช่วย
Diziet

6

จริงๆแล้วคุณสามารถทำสิ่งนี้ได้ด้วยเคล็ดลับเดียว:

แทนที่UINavigationBarคลาสและเพิ่มบรรทัดของรหัสนี้:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

จากนั้นเริ่มต้นของคุณUINavigationControllerด้วยคลาส UINavigationBar ที่กำหนดเอง .. ฯลฯUINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

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


สิ่งนี้ใช้ได้สำหรับฉัน แม้ว่าดูเหมือนว่ามีการพูดติดอ่างเล็กน้อยในภาพเคลื่อนไหวแบบพุชบน iOS 7: ชื่อดูเหมือนว่าจะทำให้มีที่ว่างสำหรับปุ่มย้อนกลับแล้วจัดกึ่งกลางเนื่องจากไม่มี
zekel

ใช่ลองใช้ titleView แบบกำหนดเองแทนการตั้งค่า navigationItem.title โดยตรง ฉันคิดว่าควรแก้ไขปัญหาของคุณ
rordulu

โซลูชันนี้ยอดเยี่ยมมากเพราะเป็นระบบนำทางทั่วโลกสำหรับแถบนำทางทุกรุ่นที่มีระดับย่อย ขอบคุณ
Yetispapa

5

ฉันสามารถที่จะปูบางสิ่งบางอย่างร่วมกันโดยใช้คำตอบของ DonnaLea นี่คือวิธีที่โซลูชันปรากฏในคลาสย่อย UIViewController ของฉัน:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

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

Caveat: ฉันเพิ่งทดสอบสิ่งนี้กับ UINavigationController push / pop ปกติ อาจมีพฤติกรรมที่ไม่คาดคิดเพิ่มเติมในสถานการณ์อื่น ๆ


4

ใน PreparForSegue: วิธีการของ ViewController แรกของคุณคุณตั้งค่าชื่อมุมมองเป็น @ "" ดังนั้นเมื่อผลักมุมมองถัดไปมันจะแสดงชื่อ ViewController ก่อนหน้าซึ่งจะเป็น @ ""

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

ปัญหาเดียวของเรื่องนี้คือเมื่อคุณกดปุ่มย้อนกลับมุมมองก่อนหน้าของคุณจะไม่มีชื่อดังนั้นคุณอาจเพิ่มอีกครั้งใน viewWillAppear:

- (void)viewWillAppear:(BOOL)animated{
    self.navigationItem.title = @"First View Title";
}

ฉันไม่ชอบโซลูชันนี้มาก แต่ใช้งานได้และฉันไม่พบวิธีอื่นที่จะทำ



3

ไม่ใช่คำตอบที่ช่วยฉัน แต่เคล็ดลับทำ - ฉันเพิ่งล้างชื่อของตัวควบคุมมุมมองที่ผลัก (ซึ่งปุ่มย้อนกลับจะไป) ก่อนที่จะผลักดันมัน

ดังนั้นเมื่อมุมมองก่อนหน้าไม่มีชื่อบน iOS 7 ปุ่มย้อนกลับจะมีลูกศรโดยไม่มีข้อความ

ในviewWillAppearมุมมองการผลักดันฉันวางตำแหน่งเดิมกลับ


1
อืมเคล็ดลับนี้ใช้ได้ผล อย่างไรก็ตามดูเหมือนว่าคำขึ้นอยู่ที่นั่นจะสั่นไหวในบางครั้ง ไม่ใช่วิธีแก้ปัญหาที่ดีมาก แต่ก็เป็นวิธีที่ดี +1
Pan Ziyue

3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

ฉันมีปัญหาเดียวกันและฉันก็ทำเช่นนี้

--EDIT--

นี่เป็นวิธีแก้ปัญหาเมื่อคุณต้องการลบข้อความหัวเรื่องของ UIBarbuttonItem ทั้งหมด หากคุณต้องการลบชื่อของรายการปุ่มแถบด้านหลังไม่มีวิธีแก้ไขปัญหาที่ง่าย ในกรณีของฉันเนื่องจากฉันมี UIBarButtonItems เพียงไม่กี่รายการเท่านั้นที่ต้องแสดงข้อความไตเติ้ลฉันจึงเปลี่ยนปุ่มชื่อเฉพาะ 'TextTextAttributes หากคุณต้องการใช้รหัสที่เฉพาะเจาะจงมากขึ้นด้านล่างซึ่งจะเปลี่ยนเฉพาะปุ่มแถบการนำทาง:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

1
สิ่งนี้ใช้ได้กับฉัน แต่คุณสามารถเห็นข้อความสั้น ๆ เมื่อกดปุ่มย้อนกลับ
Diziet

3
@Diziet ลองเพิ่มเหมือนกันสำหรับรัฐUIControlStateHighlightedเช่นกัน
CoderPug

2
ใช้งานได้ดี แต่ยัง "ซ่อน" ปุ่มอื่น ๆ ทั้งหมดไม่เพียง แต่ปุ่มย้อนกลับ ... ความคิดใดที่จะแก้ปัญหานี้
Urkman

3

นี่คือการใช้คลาสย่อยnavigationControllerลบ "ย้อนกลับ"

ฉันใช้สิ่งนี้เพื่อลบออกอย่างถาวรผ่านแอพ

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

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

@end

3
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];

1
กรุณาเพิ่มคำอธิบายให้กับคำตอบของคุณ
Alex

1 ทำให้สีเดียวกับแถบนำทาง 2 ทำให้ขนาดตัวอักษรเล็กพอที่จะไม่บีบชื่อ
Bill Xie

ฉันตรวจสอบคำตอบของคุณคุณควรสนับสนุนคำตอบของคุณเสมอ
อเล็กซ์

2

ซ่อนปุ่มย้อนกลับชื่อของแถบนำทาง

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

2

นี่คือสิ่งที่ฉันทำกับฉันซึ่งง่ายต่อการลบชื่อปุ่มย้อนกลับ

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

2

Swift 3.1 คุณสามารถทำได้โดยการใช้วิธีมอบสิทธิ์ของ UINavigationController มันจะซ่อนชื่อด้วยปุ่มย้อนกลับเท่านั้นเราจะยังคงได้ภาพลูกศรย้อนกลับและฟังก์ชั่นเริ่มต้น

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

1

คุณยังสามารถใช้สิ่งนี้:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

มันใช้งานได้สำหรับฉัน



1

โซลูชั่นที่สมบูรณ์แบบทั่วโลก

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}

วิธีการแก้ปัญหาที่ยากที่สุดของทั้งหมด ... มันยังใช้พื้นที่เหมือนเดิม ... มันเพิ่งจะโปร่งใส ...
Laszlo

มันลบข้อความออกจาก UIBarButtonItems ทั้งหมดของแอป
Mikel Sanchez

1

ฉันสร้างคลาสแบบกำหนดเองสำหรับUINavigationControllerและนำไปใช้กับตัวควบคุมการนำทางทั้งหมดในแอปของฉัน ภายในUINavigationControllerคลาสที่กำหนดเองนี้ฉันตั้งค่าUINavigationBarผู้แทนselfเมื่อโหลดดู

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

จากนั้นฉันใช้วิธีผู้ร่วมประชุม:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

วิธีนี้ฉันเพียงแค่กำหนดคลาสที่กำหนดเองของฉันให้กับตัวควบคุมการนำทางทั้งหมดของฉันและจะล้างชื่อเรื่องจากปุ่มย้อนกลับทั้งหมด และเพื่อความชัดเจนฉันมักจะตั้งชื่อให้กับตัวควบคุมมุมมองอื่น ๆ ทั้งหมดของฉันภายในviewWillAppearเพื่อที่จะได้รับการอัปเดตชื่อก่อนที่มุมมองจะปรากฏขึ้นเสมอ (ในกรณีที่ถูกลบโดยเทคนิคเช่นนี้)


1

เพียงป้อนพื้นที่เดียวสำหรับรายการการนำทางปุ่มย้อนกลับใช้งานได้ !!


1
นี่เหมาะสมกว่าความคิดเห็นมากกว่าคำตอบ
Al Lelopath

1

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

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

ดูเหมือนว่าถ้ามันไม่ได้ถูกนำเสนอแล้วไม่ว่าจะพยายามแสดงชื่ออะไรก็ตามนั่นหมายความว่ามันถูกแสดงแล้วซ่อนก่อนที่มันจะถูกดึงออกมาและแก้ปัญหา


1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

1

ผมได้ทำหมวดหมู่ที่ศูนย์การตั้งค่าง่ายมากที่จะซ่อนทั้งหมดชื่อปุ่มย้อนกลับผ่านออก app ที่คุณสามารถตรวจสอบออกที่นี่ คำถามนี้ยอมรับคำตอบแล้ว แต่สำหรับคนอื่น ๆ ก็มีประโยชน์

แก้ไข:

ไฟล์. h

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

ไฟล์. m

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.