UINavigationBar ซ่อนข้อความปุ่มย้อนกลับ


108

ฉันจะซ่อนข้อความปุ่มย้อนกลับจาก UINavigation Controller ได้อย่างไร? ฉันจะมีเพียงปุ่ม "<" และไม่ "<ย้อนกลับ"


1
คุณไม่สามารถแก้ไขข้อความเริ่มต้นได้ให้ลอง navigationItem.leftBarButtonItem แทนเพื่อตั้งค่าปุ่มย้อนกลับที่กำหนดเอง
BaSha


ดูคำตอบของฉันด้านล่างหากคุณต้องการโซลูชันระดับโลกโดยใช้พร็อกซีลักษณะ
fl034

คำตอบ:


109

ในตัวสร้างอินเทอร์เฟซคุณสามารถเลือกรายการการนำทางของตัวควบคุมก่อนหน้าและเปลี่ยนBack Buttonสตริงตามที่คุณต้องการให้ปุ่มย้อนกลับปรากฏ ตัวอย่างเช่นหากคุณต้องการให้ว่างให้ใส่ช่องว่าง

คุณยังสามารถเปลี่ยนได้ด้วยโค้ดบรรทัดนี้:

[self.navigationItem.backBarButtonItem setTitle:@"Title here"];

หรือในSwift :

self.navigationItem.backBarButtonItem?.title = ""


2
เคล็ดลับที่ยอดเยี่ยมเกี่ยวกับการตั้งค่าพื้นที่ว่างบนตัวสร้างอินเทอร์เฟซ ... :-D
Felipe Ferri

9
เครื่องมือสร้างอินเทอร์เฟซและเส้นทางแบบเป็นโปรแกรมของ Swift ไม่ทำงานสำหรับฉันใน XCode 8.3.2, Swift 3
agrippa

คุณสามารถตรวจสอบวิธีง่ายๆของฉันในการซ่อนปุ่มย้อนกลับทั้งหมดผ่านแอพ PS: ต้องใช้รหัสศูนย์ของคุณเอง
Pratik Jamariya

2
หากBack Buttonว่างใน IB อยู่แล้วเพียงแค่เพิ่มช่องว่างเพื่อขึ้นรถBackและแสดงลูกศร
Tejas K

3
ปัจจุบันวิธีนี้ใช้ได้เฉพาะในตัวสร้างอินเทอร์เฟซ การตั้งค่านี้จากโค้ดใช้ไม่ได้แทนที่จะตั้งเฉพาะหัวเรื่องคุณต้องตั้ง backBarButtonItem ทั้งหมดเช่นนี้ navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target: nil, action: nil)
Leszek Szary

82

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

โดยทางโปรแกรมคุณสามารถใช้ได้

[self.navigationItem.backBarButtonItem setTitle:@" "];

โดยที่ตัวเองหมายถึงคอนโทรลเลอร์ซึ่งผลักดันคอนโทรลเลอร์ View ที่คุณต้องการ

รายการการนำทาง Xcode view controller

ตัวอย่างก่อนหลังแถบนำทาง

ก่อน ก่อน

หลังจาก หลังจาก


7
สิ่งนี้จะทำงานได้อย่างสมบูรณ์หากตั้งไว้ในสตอรีบอร์ด ตรวจสอบให้แน่ใจว่าแถบนำทางมีรายการนำทางอยู่เพื่อให้สามารถตั้งค่าได้

11
ใน iOS 9 / Xcode 7.3 การตั้งค่าโดยใช้backBarButtonItemโปรแกรมจะไม่ทำงาน แต่การตั้งค่าผ่านสตอรี่บอร์ดทำได้
Scott Gardner

@ScottGardner การตั้งค่าโดยทางbackBarButtonItemโปรแกรมใช้งานได้สำหรับฉันใน iOS 9
Suragch

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

โซลูชันทำงานได้ดีและใช้งานง่ายมากใน Xcode 9.2 / iOS 11
Ray Hunter

82

คุณสามารถใช้งานได้UINavigationControllerDelegateดังนี้:

Swift รุ่นเก่า

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

สวิฟต์ 4.x

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

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

backBarButtonItemเป็นnilค่าเริ่มต้นและจะมีผลต่อตัวควบคุมแบบพุชถัดไปดังนั้นคุณเพียงแค่ตั้งค่าสำหรับคอนโทรลเลอร์ทั้งหมด


6
ขอบคุณ! นี่เป็นวิธีแก้ปัญหาเดียวที่ใช้ได้ผล (โดยไม่ต้องทำอะไรให้วุ่นวาย) หลังจากดูคำถามที่ซ้ำกัน 4 ข้อและคำตอบอีกมากมาย
inket

1
ฉันมีคลาสย่อยของตัวควบคุมการนำทางที่ฉันสร้างขึ้นเป็นตัวแทนของตัวเองซึ่งทำงานได้อย่างสมบูรณ์แบบ ควรอัปเดตสำหรับ Swift 3 แม้ว่า
Dean Kelly

วิธีแก้ปัญหาที่ยอดเยี่ยมขอบคุณหนึ่งเดียวที่ทำงานอย่างสม่ำเสมอสำหรับฉัน
Elliott Davies

Woks เหมือนมีเสน่ห์
tounaobun

50

การตั้งชื่อปุ่มย้อนกลับเป็น@""หรือnilไม่ทำงาน คุณต้องตั้งค่าปุ่มทั้งหมดให้ว่าง (โดยไม่มีชื่อหรือรูปภาพ):

วัตถุประสงค์ -C

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

รวดเร็ว

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

สิ่งนี้ควรทำบนตัวควบคุมมุมมองที่อยู่ด้านบนของตัวควบคุมมุมมองของคุณในสแต็กการนำทาง (เช่นจากที่ที่คุณนำทางไปยัง VC ของคุณด้วยpushViewControllerวิธีการ)


2
ขอบคุณมันได้ผล! อย่างรวดเร็ว: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .Plain, target: nil, action: nil)
mostworld77

คำตอบที่ยอดเยี่ยม .. ชี้ให้เห็นอย่างถูกต้องว่าการเปลี่ยนชื่อของ backBarButtonItem เริ่มต้นจะไม่เพียงพอ คะแนนโบนัสสำหรับการระบุว่า backBarButtonItem ควรตั้งค่าในตัวควบคุมมุมมองก่อนหน้านี้
Crazed'n'Dazed

31

อีกวิธีหนึ่งสำหรับปัญหานี้สำหรับสถานการณ์ที่คุณมีตัวควบคุมมุมมองจำนวนมากคือการใช้UIAppearanceพร็อกซีเพื่อซ่อนข้อความชื่อปุ่มย้อนกลับอย่างมีประสิทธิภาพเช่นนี้:

UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];

[navBarButtonAppearance setTitleTextAttributes:@{
    NSFontAttributeName:            [UIFont systemFontOfSize:0.1],
    NSForegroundColorAttributeName: [UIColor clearColor] }
                                      forState:UIControlStateNormal];

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

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

หากต้องการเลือกว่าจะแสดงชื่อเรื่องเมื่อใดให้เรียกคืนแอตทริบิวต์ข้อความหัวเรื่องด้วยตนเองตามต้องการหรือสร้างคลาสย่อยพิเศษUIBarButtonItemที่ทำเช่นเดียวกัน (อาจใช้กับUIAppearanceพร็อกซีอื่น)

หากคุณมีแอปที่ต้องซ่อนชื่อปุ่มย้อนกลับส่วนใหญ่และปุ่มนำทางเพียงไม่กี่ปุ่ม (หรือไม่มีเลย) เป็นปุ่มระบบที่มีชื่อเรื่องสิ่งนี้อาจเหมาะสำหรับคุณ!

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


เป็นวิธีที่ง่ายที่สุดสำหรับการติดตั้งของฉัน ขอบคุณ.
Trevor Panhorst

3
สิ่งนี้ไม่ครอบคลุมรายการปุ่มแถบด้านซ้ายที่ไม่ใช่ปุ่มย้อนกลับหรือไม่?
kevinl

1
ใช่ฉันสังเกตมาก "มีผลกับปุ่มแถบนำทางทั้งหมด"
Adam Kaplan

2
ไม่ควรส่งผลกระทบต่อปุ่มอื่น ๆ ทั้งหมดในแถบนำทางรวมถึงรายการปุ่มแถบซ้าย / ขวา
Fyodor Volchyok

ใช่เขาไม่ได้ระบุข้อกำหนดที่ครอบคลุมมากขึ้น
Adam Kaplan

31

เพิ่มรหัสต่อไปนี้ใน viewDidLoad หรือ loadView

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

ฉันทดสอบใน iPhone และ iPad ด้วย iOS 9


20
ไม่ได้ล้างชื่อของตัวควบคุมมุมมองก่อนหน้า?
CalZone

6
อย่าใช้เพราะมันจะลบชื่อหน้าจอสุดท้าย
evya

1
หากคุณต้องการทำจากตัวควบคุมมุมมองปัจจุบันเพื่อหลีกเลี่ยงการลบหัวเรื่องออกจาก vc ก่อนหน้าคุณควรทำ: navigationController? .navigationBar.topItem? .backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target: nil, action: nil)
Leszek Szary

16

คุณสามารถเพิ่มหมวด Objective-C นี้เพื่อทำให้ปุ่ม "ย้อนกลับ" ทั้งหมดที่สร้างโดยตัวควบคุมการนำทางไม่มีข้อความ ฉันเพิ่งเพิ่มลงในไฟล์ AppDelegate.m

@implementation UINavigationItem (Customization)

/**
 Removes text from all default back buttons so only the arrow or custom image shows up.
 */
-(UIBarButtonItem *)backBarButtonItem
{
    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

PS - (ฉันไม่รู้ว่าจะทำให้ส่วนขยายนี้ทำงานกับ Swift ได้อย่างไร แต่มีข้อผิดพลาดแปลก ๆ ยินดีให้แก้ไขเพื่อเพิ่มเวอร์ชัน Swift)


เรื่องนี้ให้ชื่อ "ย้อนกลับ" ไม่ซ่อนชื่อ
Raj Aggrawal

จริงๆวิธีการoverrideอย่างรวดเร็ว คำถามที่น่าสนใจมาก
Andrey Gagan

@teradyl เป็นคำตอบที่ดีที่สุด
aks.knit1108

@Andrey Gagan ดูคำตอบของฉัน
Abirami Bala

ใช้งานได้บน iOS 9.0 - 10.3.3 แต่บน iOS 11+ ไม่ทำงาน
Sihad Begovic

15

ฉันลองด้านบนและด้านล่าง แต่ไม่ได้ผล สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

2
หากคุณต้องการทำจากตัวควบคุมมุมมองปัจจุบันเพื่อหลีกเลี่ยงการลบหัวเรื่องออกจาก vc ก่อนหน้าคุณควรทำ: navigationController? .navigationBar.topItem? .backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target: nil, action: nil)
Leszek Szary

มันใช้ได้ในเคสของฉัน iOS14, XCode 12 ขอบคุณเจ้านาย
Tai Le

12

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

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

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

override func viewDidLoad() {
    super.viewDidLoad()

    setupBackButton()
}

เป็นเรื่องสำคัญมากที่คุณต้องตั้งค่าช่องว่างเป็นชื่อเรื่องไม่ใช่สตริงว่าง


9

เพื่อลบข้อความออกจากปุ่มย้อนกลับโดยทางโปรแกรมใช้ด้านล่างโค้ดซึ่งจะทำงานในรูปแบบ xcode7 ขึ้นไป

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

หรือ

manualLy ในสตอรีบอร์ดเลือกแถบนำทางบนตัวควบคุมมุมมองและใส่ "" ในข้อความปุ่มย้อนกลับ

สิ่งนี้จะได้ผล ขอบคุณ


2
อันนี้จะลบ navigationItem title ด้วย
Ilker Baltaci

ฉันแก้ไขคำตอบของคุณสำหรับสิ่งนี้: self.navigationController?.navigationBar.topItem?.title = " "ใน Xcode 9 และใช้งานได้!
MHSFisher

หากคุณต้องการทำจากตัวควบคุมมุมมองปัจจุบันเพื่อหลีกเลี่ยงการลบหัวเรื่องออกจาก vc ก่อนหน้าคุณควรทำ: navigationController? .navigationBar.topItem? .backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target: nil, action: nil)
Leszek Szary

8

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

กลับไปที่ตัวควบคุมมุมมองก่อนหน้าและตั้งค่าคุณสมบัติหัวเรื่อง:

self.title = @" ";

ใช้งานได้เฉพาะเมื่อ View Controller ก่อนหน้านี้ไม่มีชื่อเรื่อง


@ZevEisenberg ตรวจสอบให้แน่ใจว่าคุณสมบัติถูกตั้งค่าก่อนที่จะแสดงในวงจรชีวิตของ View Controller ความหมายตั้งค่าในเมธอด viewDidLoad หรือ viewWillAppear
ChrisHaze

1
อย่าลืมเว้นวรรคระหว่างเครื่องหมายคำพูดด้วย
ChrisHaze

1
มันจบลงด้วยการทำงานให้ฉันโดยไม่มีช่องว่าง; สตริงว่างเปล่าเก่าที่ดี: @"".
Zev Eisenberg

1
@ZevEisenberg เมื่อฉันคิดวิธีแก้ปัญหาครั้งแรกมันก่อนหน้านี้ใน Xcode 5 ด้วยช่องว่างเป็นวิธีเดียวที่ใช้งานได้ซึ่งเป็นสาเหตุที่ฉันรวมไว้ในโค้ดตัวอย่าง ต้องมีการอัปเดต Xcode 6 รวมอยู่ด้วย
นานา

ฉันยังใช้แนวทางของฉันซึ่งยังใช้งานได้จริงและลบลูกศรย้อนกลับมาตรฐานด้วย
ChrisHaze

5

ทางเลือกอื่น - ใช้คลาส NavigationBar ที่กำหนดเอง

class NavigationBar: UINavigationBar {

    var hideBackItem = true
    private let emptyTitle = ""

    override func layoutSubviews() {
        if let `topItem` = topItem,
            topItem.backBarButtonItem?.title != emptyTitle,
            hideBackItem {
            topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
        }

        super.layoutSubviews()
    }

}

นั่นคือการลบกลับชื่อโครงการทั้งหมด เพียงตั้งค่าคลาสที่กำหนดเองสำหรับ UINavigationController


4

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

Self.title = " "

เปิดกลับกดรีเซ็ตชื่อเรื่องเป็นต้นฉบับอีกครั้งใน viewWillAppear


4

ใช้แบบกำหนดเองNavigationControllerที่ลบล้างpushViewController

class NavigationController: UINavigationController {  
  override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    viewController.navigationItem.backBarButtonItem =
      UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    super.pushViewController(viewController, animated: animated)
  }
}

4

มีคำตอบมากมายแล้วนี่คือสองเซ็นต์ของฉันในหัวข้อนี้ ฉันพบว่าแนวทางนี้แข็งแกร่งจริงๆ คุณต้องใส่สิ่งนี้ไว้ใน viewController ก่อนทำต่อ

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

2
ใช่ ขอบคุณ :)
Hews

3

ฉันพยายามทุกอย่างในโพสต์นี้ ทางออกเดียวที่ใช้งานได้คือ @ VoidLess's

นี่คือคำตอบเดียวกัน แต่สมบูรณ์กว่า

class CustomNavigationController: UINavigationController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.delegate = self
    }
}


// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    }
}

3

นี่คือความละเอียดของฉันสำหรับ iOS11 ฉันเปลี่ยนรูปลักษณ์ของ UIBarButtonItem ใน applicationDidFinishLaunchingWithOptions:

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)

คุณไม่สามารถเปลี่ยน Y offset ได้เพราะมันจะเปลี่ยนตำแหน่งของปุ่มแถบด้านหลังเช่นกันใน iOS11 แต่ใช้ได้ใน iOS10 และต่ำกว่า


1
ใช้งานได้ แต่ในระหว่างภาพเคลื่อนไหวคุณจะเห็นชื่อเรื่องก่อนหน้านี้เลื่อนไปทางซ้าย มันดูบักกี้เล็กน้อย
Jonathan

3

Swift 3.1 คุณสามารถทำได้โดยใช้วิธีการมอบหมายของ UINavigationController

func navigationController(_ navigationController: UINavigationController, 
                          willShow viewController: UIViewController, animated: Bool) {

    /** It'll hide the Title with back button only,
     ** we'll still get the back arrow image and default functionality.
     */
    let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                               action: nil)
    viewController.navigationItem.backBarButtonItem = item
}

คำตอบที่ดีที่สุด!
evya

2

ใน Swift3

หากคุณตั้งค่าส่วนกลาง

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // ..

    let BarButtonItemAppearance = UIBarButtonItem.appearance()
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)


    // ...

}

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

2

สำหรับผู้ที่ต้องการซ่อนชื่อปุ่มย้อนกลับทั่วโลก

คุณสามารถ swizzle viewDidLoadของUIViewControllerเช่นนี้

+ (void)overrideBackButtonTitle {

    NSError *error;

    // I use `Aspects` for easier swizzling.

    [UIViewController aspect_hookSelector:@selector(viewDidLoad)
                              withOptions:AspectPositionBefore
                               usingBlock:^(id<AspectInfo> aspectInfo)
    {

        UIViewController *vc = (UIViewController *)aspectInfo.instance;

        // Check whether this class is my app's view controller or not.
        // We don't want to override this for Apple's view controllers,
        // or view controllers from external framework.

        NSString *className = NSStringFromClass([vc class]);
        Class class = [NSBundle.mainBundle classNamed:className];
        if (!class) {
           return;
        }

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

    } error:&error];

    if (error) {
        NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
    }

}

การใช้งาน:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[self class] overrideBackButtonTitle];
    return YES;
}

1

ฉันกำลังดิ้นรนกับเรื่องนี้เพราะฉันมีตัวควบคุมการนำทางที่กำหนดเอง ฉันสามารถลบข้อความรายการด้านหลังในตัวควบคุมมุมมองทั้งหมดด้วยรหัสนี้ในคลาสตัวควบคุมการนำทางที่กำหนดเองของฉัน override func viewDidLayoutSubviews() { self.navigationBar.backItem?.title = "" }

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


1
อัปเดตสำหรับสิ่งนี้: ใช้งานได้ แต่มีความล่าช้าในการโหลดที่รบกวนฉัน ตอนนี้ฉันได้เพิ่มสิ่งนี้ 'ให้ BarButtonItemAppearance = UIBarButtonItem.appearance () BarButtonItemAppearance.setTitleTextAttributes ([NSAttributedStringKey.foregroundColor: UIColor.clear] สำหรับ: .normal)' ใน App delegate didLaunchWithOptions ทำงานได้อย่างสมบูรณ์แบบ!
Amy.R

1

หากคุณกำหนดเป้าหมายiOS 13และหลังจากนั้นคุณสามารถใช้API ใหม่นี้จะซ่อนชื่อปุ่มย้อนกลับทั่วโลก

let backButtonAppearance = UIBarButtonItemAppearance()
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]

UINavigationBar.appearance().standardAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().compactAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().scrollEdgeAppearance.backButtonAppearance = backButtonAppearance

1
สิ่งนี้ไม่เหมาะสม หากผู้ใช้แตะป้ายที่มีข้อความชัดเจนการดำเนินการย้อนกลับจะยังคงถูกทริกเกอร์
dvdblk

0

ใน iOS 11 เราพบว่าการตั้งค่าUIBarButtonItemแบบอักษร / สีข้อความของลักษณะที่ปรากฏเป็นค่าที่น้อยมากหรือสีที่ชัดเจนจะส่งผลให้รายการแถบอื่นหายไป (ระบบไม่ให้เกียรติคลาสของรายการ UIBarButton อีกต่อไปมันจะแปลงเป็น_UIModernBarButton ) นอกจากนี้การตั้งค่าออฟเซ็ตของข้อความด้านหลังเป็นปิดหน้าจอจะส่งผลให้กะพริบระหว่างป๊อปโต้ตอบ

ดังนั้นเราจึงหมุนaddSubView:

+ (void)load {
    if (@available(iOS 11, *)) {
        [NSClassFromString(@"_UIBackButtonContainerView")     jr_swizzleMethod:@selector(addSubview:) withMethod:@selector(MyiOS11BackButtonNoTextTrick_addSubview:) error:nil];
    }
}

- (void)MyiOS11BackButtonNoTextTrick_addSubview:(UIView *)view {
    view.alpha = 0;
    if ([view isKindOfClass:[UIButton class]]) {
        UIButton *button = (id)view;
        [button setTitle:@" " forState:UIControlStateNormal];
    }
    [self MyiOS11BackButtonNoTextTrick_addSubview:view];
}

0
-(void)setNavigationItems{
     UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];   
     self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
    [self.navigationController popViewControllerAnimated:YES];
}

0

ข้อความกลับมาจากที่ผ่านมาดูผู้ควบคุมnavigationItem.titleและมีการตั้งค่าโดยอัตโนมัติโดยnavigationItem.title self.titleวิธีง่ายๆในการแก้ปัญหาคือขอsetTitle:ให้แน่ใจnavigationItem.title = @""

ใส่รหัสนี้AppDelegate.mจะทำให้ใช้ได้。

    [UIViewController aspect_hookSelector:@selector(setTitle:)
                              withOptions:AspectPositionAfter
                               usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
        UIViewController *vc = aspectInfo.instance;
        vc.navigationItem.titleView = ({
            UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
            titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
            titleLabel.text = title;
            titleLabel;
        });
        vc.navigationItem.title = @"";
    } error:NULL];

รายละเอียดเพิ่มเติมที่https://www.jianshu.com/p/071bc50f1475(Simple Chinease)


0

วิธีแก้ปัญหาของฉัน: - XCode: 10.2.1 - Swift: 5

  • ตัวควบคุมมุมมองผู้ปกครอง:
    • self.title = ""
  • ตัวควบคุมมุมมองเด็ก:
    • self.navigationItem.title = "Your title" // เพื่อตั้งหัวเรื่องสำหรับ viewcontroller

0

XCode 11.5 Swift 5

วิธีที่ง่ายมากแม้ว่าอาจจะเป็นวิธีแฮ็คเล็กน้อยในการทำโปรแกรมหากคุณไม่ต้องการปุ่มย้อนกลับที่กำหนดเองคือการตั้งค่าขนาดตัวอักษรให้เท่ากับศูนย์ในตัวควบคุมมุมมองที่คุณกำลังผลักดันไปที่กองซ้อนเรียกสิ่งนี้ จาก viewDidLoad

private func setupNavBar() {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithDefaultBackground()
    
    let backButtonAppearance = UIBarButtonItemAppearance()
    backButtonAppearance.normal.titleTextAttributes = [.font: UIFont(name: "Arial", size: 0)!]
    appearance.backButtonAppearance = backButtonAppearance

    navigationItem.standardAppearance = appearance
    navigationItem.scrollEdgeAppearance = appearance
    navigationItem.compactAppearance = appearance
}

-1

ในที่สุดก็พบโซลูชันที่สมบูรณ์แบบในการซ่อนข้อความด้านหลังเริ่มต้นในแอปทั้งหมด

เพียงเพิ่มภาพโปร่งใสหนึ่งภาพและเพิ่มรหัสต่อไปนี้ใน AppDelegate ของคุณ

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

-2

วิธีการต่อไปนี้ใช้ได้กับ iOS 11 และปลอดภัยที่จะไม่เกิดปัญหากับ iOS เวอร์ชันอื่น ๆ การทำเช่นนี้อาจทำให้แอปของคุณถูกปฏิเสธในการตรวจสอบ App Store เนื่องจากทั้ง UIModernBarButton และ UIBackButtonContainerView เป็น API ส่วนตัว วางใน AppDelegate

    if
        let UIModernBarButton = NSClassFromString("_UIModernBarButton") as? UIButton.Type,
        let UIBackButtonContainerView = NSClassFromString("_UIBackButtonContainerView") as? UIView.Type {

        let backButton = UIModernBarButton.appearance(whenContainedInInstancesOf: [UIBackButtonContainerView.self])
        backButton.setTitleColor(.clear, for: .normal)
    }

การทำเช่นนี้อาจทำให้แอปของคุณถูกปฏิเสธในการตรวจสอบ App Store เนื่องจากทั้ง UIModernBarButton และ UIBackButtonContainerView เป็น API ส่วนตัว
Groot

ขอบคุณ @Groot เพิ่มคำเตือนของคุณ
Patrick

-5

นี่มาจากรหัส xamarin.forms ของฉันคลาสมาจาก NavigationRenderer

NavigationBar.Items.FirstOrDefault().BackBarButtonItem = new UIBarButtonItem( "", UIBarButtonItemStyle.Plain, null);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.