UINavigationBar ปุ่มย้อนกลับที่กำหนดเองโดยไม่มีชื่อ


231

ฉันจะกำหนดปุ่มการนำทางกลับใน iOS 7 ขึ้นไปโดยไม่มีชื่อได้อย่างไร (เช่นมีลูกศรเท่านั้น)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

ฉันแค่สงสัยว่าพวกเขามีแบ็คเบตตัวเองหรือไม่

หรือ

อะไรแบบนี้?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
คุณสามารถใช้ @hiroshi answer + คุณสมบัติการนำทางแถบสี tintColor เพื่อทำเครื่องหมายบั้งด้วยสีที่กำหนดเองและไม่มีชื่อเรื่องใด ๆ
Dmitry Zhukov

สำหรับผู้ที่มีแถบแท็บและคุณไม่ต้องการข้อความของปุ่มย้อนกลับการแก้ไขคือ: ในviewDidLoad ()ของ TabBarController ใส่: self.navigationItem.backBarButtonItem = UIBarButtonItem (หัวเรื่อง: "", style:. " ธรรมดา, เป้าหมาย: ไม่มี, การกระทำ: ไม่มี)
Borzh

คำตอบ:


313

จริงๆแล้วมันง่ายจริงๆนี่คือสิ่งที่ฉันทำ:

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

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

สวิฟท์ 2

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

สวิฟท์ 3

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

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


3
ฉันใช้สิ่งนี้ แต่ชื่อมาและหายไปในแบบเคลื่อนไหว?
user1010819

7
ขอบคุณไคล์! ฉันกำลังมองหาวิธีเปลี่ยนชื่อปุ่มย้อนกลับเป็นค่าเริ่มต้นใน iOS 7 ฉันวางสิ่งนี้ไว้prepareForSegueในตัวควบคุมมุมมองและทำงานได้อย่างสมบูรณ์
yiwei

1
@ user1010819 นี่เป็นพฤติกรรมที่คาดหวัง barButtonItems จะทำให้เคลื่อนไหวเข้าและออกเมื่อเปลี่ยนมุมมองคอนโทรลเลอร์ คุณพยายามทำอะไรให้สำเร็จ
Kyle Begeman

1
@YiweiGao ไม่มีปัญหา! มันเป็นอีกสิ่งหนึ่งที่ถ้าคุณรู้รหัสที่ถูกต้องมันค่อนข้างง่าย! ฉันดีใจที่มันช่วยได้!
Kyle Begeman

3
ฉันรู้สึกว่าต้องมีการอัปเดต แต่ตอนนี้ไม่แสดงอะไรเลยลูกศรไม่มีค่าเริ่มต้น
Mathijs Segers

198

ฉันพบวิธีที่ง่ายในการสร้างปุ่มย้อนกลับด้วยปุ่มลูกศรเดียวของ iOS

สมมติว่าคุณมีตัวควบคุมทิศทางไปที่ ViewA จาก ViewB ใน IB ให้เลือกแถบการนำทางของ ViewA คุณจะเห็นตัวเลือกเหล่านี้: ชื่อปุ่มพร้อมท์และปุ่มย้อนกลับ

ตัวเลือกแถบนำทางของ ViewA

ตัวเลือกแถบนำทางของ ViewA

เคล็ดลับคือเลือกชื่อปุ่มย้อนกลับของตัวควบคุมมุมมองชะตากรรมของคุณ (ViewB) ในตัวเลือกของตัวควบคุมมุมมองก่อนหน้า (ดู A) หากคุณไม่กรอกตัวเลือก "ปุ่มย้อนกลับ" iOS จะใส่ชื่อ "ย้อนกลับ" โดยอัตโนมัติด้วยชื่อของตัวควบคุมมุมมองก่อนหน้า ดังนั้นคุณต้องกรอกตัวเลือกนี้ด้วยช่องว่างเดียว

เติมช่องว่างในตัวเลือก "ปุ่มย้อนกลับ"

เติมช่องว่างในตัวเลือก "ปุ่มย้อนกลับ"

ผลลัพธ์:

ผลลัพธ์:


ยินดีต้อนรับสู่กองมากเกิน หากคุณยังไม่ได้ดูที่สิ่งที่เรากำลังทัวร์และอ่านบทความบางส่วนในศูนย์ช่วยเหลือเกี่ยวกับวิธีการที่เราทำงานและประเพณีชุมชนบางส่วนที่นี่ หากคุณต้องการความช่วยเหลือเกี่ยวกับฟังก์ชั่นของเว็บไซต์อย่ากลัวที่จะค้นหาแล้วถามคำถามเกี่ยวกับMeta Stack Overflow (ถ้าคุณยังไม่พบคำตอบ) ขอขอบคุณและขอให้โชคดี! อย่างไรก็ตามคุณสามารถโพสต์ภาพของคุณได้ในตอนนี้ ... :)
Qantas 94 Heavy

53
ใช้งานได้ดี - คุณต้องตั้งค่า "ปุ่มย้อนกลับ" สำหรับตัวควบคุมก่อนหน้า (เช่นสำหรับ rootViewController ในตัวควบคุมการนำทางของคุณ)
evfemist

ให้แน่ใจว่าคุณไม่ได้มี "hidesBackButton" ตั้งค่าเป็นจริงในรายการนำทางใน ViewA
ชิม

ฉันคิดว่ามันใช้งานได้ถ้าชื่อของตัวควบคุมที่นำเสนอนั้นยาวพอ - ถ้ามันเป็นชื่อสั้น ๆ มันจะถูกใช้แทน
amergin

1
สำหรับฉันมันทำงานเฉพาะเมื่อทั้งต้นทางและปลายทางของ ViewController NavigationItem ได้Back Buttonตั้งค่าให้เป็นอักขระช่องว่างเดียว (คือทั้ง ViewA และ ViewB)
dcestari

72

เพียงแค่ใช้ภาพ!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

สวิฟท์ 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

ไอคอน Back.png

ไอคอนกลับ

Icon-Back@2x.png

ไอคอน-Back @ 2x

Icon-Back@3x.png

ไอคอน-Back @ 23x


4
ด้วยวิธีนี้คุณดูเหมือนจะหลวมฟังก์ชั่น "ปัดเพื่อย้อนกลับ"
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfเคล็ดลับในการรักษาท่าทางการปัดกลับ
Victor Carmouze

ฉันได้ค้นหาคำตอบนี้บางทีตลอดชีวิตของฉันคือตัวเลือกการกระทำ
Des

29

iOS7 มีกฎของอินเทอร์เฟซใหม่ดังนั้นควรเก็บลูกศรย้อนกลับอย่างน้อยเมื่อคุณกด UIView มันง่ายมากที่จะเปลี่ยนข้อความ "ย้อนกลับ" โดยทางโปรแกรม เพียงแค่เพิ่มรหัสนี้ก่อนที่จะผลักดันมุมมอง (หรือเตรียมความพร้อมก่อนเริ่มต้นหากคุณกำลังใช้ StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

สิ่งนี้จะเปลี่ยนข้อความ "ย้อนกลับ" เริ่มต้น แต่จะเก็บลูกศรย้อนหลังสไตล์ iOS7 ไว้ คุณยังสามารถเปลี่ยนสีอ่อนสำหรับลูกศรย้อนกลับก่อนที่จะกดดู:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

หวังว่านี่จะช่วยคุณได้!


2
มันใช้งานได้ดีจริงๆและดูเหมือนจะดีกว่าตัวเลือกอื่น ๆ ตัวอย่างเช่นชื่อไม่จำเป็นต้องถูกรีเซ็ตเป็นค่าก่อนหน้าซึ่งต่างจากคำตอบอื่น ๆ
pr1001

26

คุณไม่ต้องทำอะไรมาก คุณสามารถบรรลุเป้าหมายเดียวกันผ่านกระดานเรื่องราวได้

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

ตามภาพด้านล่าง  ใช้งานได้กับ iOS 7 และ iOS 8


ฉันลองแล้วใช้งานได้ แต่ฉันยังคงไม่สามารถเปลี่ยนชื่อในรหัส
Yu-Lin Wang

ทำงานกับ XCode7 แต่ไม่ทำงานอีกต่อไปใน xCode8 -> ios10.X ฉันใช้วิธีการ
@iwasrobbed แล้ว

อัจฉริยะทั้งหมดนั้นง่าย!
Illya Krit

22

ในขณะที่คำตอบของ Kyle Begemanทำอุบายอย่างสมบูรณ์มันค่อนข้างน่ารำคาญที่จะมีรหัสนี้ในทุก ๆ มุมมองที่เป็นไปได้ ฉันจบด้วยUINavigationItemหมวดหมู่ง่าย ๆ ระวังนี่มังกร! ขออภัยฉันหมายถึง:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
ฉัน upvoted แต่ตัดสินใจที่จะใช้แฮ็คที่ง่ายกว่าแทน - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; (ที่มา ) - อาจจะดูสง่างามน้อยลง แต่รู้สึกว่องไวเหมือน overkill
dmur

2
y'all อย่างจริงจัง ... ไม่ผ่านการแก้ปัญหาอื่น ๆ ใช้โซลูชัน @nicky ที่โพสต์เป็นหมวดหมู่และอย่าคิดสองครั้ง นี่เป็นโซลูชันที่สามารถนำกลับมาใช้ใหม่ได้อย่างยอดเยี่ยมซึ่งสามารถนำไปใช้กับแอพได้อย่างกว้างขวางหากคุณเพิ่มไฟล์ Prefix.pch นี้ Apple สนับสนุนให้ใช้หมวดหมู่เพื่อเพิ่มวิธีการในชั้นเรียนที่มีอยู่คุณควรใช้ประโยชน์จากสิ่งนี้เมื่อเป็นไปได้
zmonteca

นี่เป็นทางออกที่ดีที่สุดในความคิดของฉันอย่างไรก็ตาม "method_exchangeImplementation" นั้นค่อนข้างไม่ปลอดภัยลองดูที่นี่: วิธีที่ถูกต้องในการSwizzle และคำแนะนำการตบ NSHipster
Alessandro Orrù

@ AlessandroOrrùในกรณีนี้ควรปลอดภัยเพราะวิธีการ swizzled เป็นวิธีการUINavigationItemของตัวเองมากไม่มีการเกี่ยวข้องทางพันธุกรรม และ_cmdไม่น่าเป็นไปได้ที่จะมีส่วนร่วมในทะเยอทะยาน อย่างไรก็ตามมันเป็นจุดที่ดี ดังนั้นถ้าคุณมีผู้ช่วยเหลือแบบ swizzling มากมายในโครงการของคุณให้แน่ใจว่าคุณใช้ที่นี่ด้วย
secondcitysaint

21

แก้ไข: 2014-04-09: เมื่อฉันได้รับชื่อเสียงฉันรู้สึกเสียใจเพราะฉันไม่ได้ใช้เคล็ดลับนี้อีก ฉันแนะนำคำตอบของ Kyle นอกจากนี้ยังแจ้งให้ทราบว่าselfของself.navigationItem.backBarButtonItemไม่ได้มุมมองควบคุมปุ่มย้อนกลับจะปรากฏ แต่ตัวควบคุมมุมมองก่อนหน้าที่จะเดินกลับ

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

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

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

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


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

@Alioo คุณลองสิ่งที่ฉันพูดถึงในบรรทัด "แก้ไข" หรือไม่?
ฮิโรชิ

20

ใช้งานได้ แต่จะลบชื่อของรายการก่อนหน้าแม้ว่าคุณจะกลับมา:

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

เพียงตั้งค่าคุณสมบัตินี้บนviewDidLoadของ View Controller ที่พุช


17
การดำเนินการนี้จะลบชื่อของรายการก่อนหน้าแม้ว่าคุณจะกลับมา ไม่ค่อยดี :(
Antzi

ฉันตั้งชื่อของการผลักดัน VC viewWillAppearเพื่อให้มันถูกตั้งค่าอย่างถูกต้องเสมอ
Guto Araujo

@GutoAraujo มันใช้งานได้ แต่ชื่อเรื่องปรากฏขึ้นอีกครั้งกับแม่มดล่าช้า 1 หรือ 2 วินาทีทำให้ UX นั้นไม่ค่อยดี
fuiiii

ใน xCode8 -> ios10.X นี่น่าจะเป็นวิธีเดียวที่จะแก้ไขปัญหาได้
LucioB

12

นี่คือวิธีที่ฉันทำและวิธีที่ง่ายที่สุดทำงานได้และวิธีที่ชัดเจนที่สุดที่จะทำ

ใช้งานได้หากฝัง Navigation Controller

สวิฟท์ 3

ในviewDidLoadฉันเพิ่มสิ่งนี้ลงใน View Controller คุณต้องการให้ปุ่มย้อนกลับเป็นเพียงลูกศร

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

ความแตกต่างของคำตอบนี้กับ @Kyle Begeman คือคุณเรียกสิ่งนี้บนตัวควบคุมมุมมองที่คุณต้องการให้ปุ่มย้อนกลับเป็นเพียงลูกศรไม่ใช่ในตัวควบคุมมุมมองแบบพุชแบบพุช


7

คุณไม่มีสิทธิ์เข้าถึงการนำทาง backButtonItem ในแบบที่คุณต้องการคุณต้องสร้างปุ่มย้อนกลับของคุณเองด้านล่าง:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

และนอกหลักสูตร:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

จากนั้นเราก็สูญเสียอนิเมชั่นจางหายไปที่เกิดขึ้นบนปุ่มย้อนกลับ
Kiddo

3
คุณต้องมีหน้ากากเพื่อการเปลี่ยนที่ราบรื่น "* ถ้าคุณต้องการใช้รูปภาพแบบกำหนดเองเพื่อแทนที่รูปบั้งเริ่มต้นคุณต้องสร้างรูปแบบมาสก์ที่กำหนดเองด้วย iOS 7 ใช้รูปแบบเพื่อให้ชื่อหน้าจอก่อนหน้าปรากฏขึ้นหรือหายไป - รูปบั้งระหว่างการนำทาง เปลี่ยน."
ผู้ใช้

3
@ ไม่มีคุณจะสูญเสียท่าทางรูดไปด้านข้างของ iOS 7!
Mazen Kasser

@user ฉันได้ภาพที่กำหนดเอง แต่สีอ่อนเป็นสีน้ำเงินโดยค่าเริ่มต้น ฉันจะไม่เพิ่มสีอ่อนได้อย่างไร? ขอบคุณ
Mazen Kasser

7

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

ขั้นตอน: 1. ในวิธี "didFinishLaunchingWithOptions" ของ AppDelete:

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2. ในviewDidLoadวิธีการของViewControllerclass super สามัญ:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

สิ่งนี้แสดงคำเตือน "รุ่น SYSTEM_VESION _... " โดยนัยไม่ถูกต้องใน C99
Jayprakash Dubey

7

SWIFT 4

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

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

เพื่อการใช้งานที่เป็นสากลยิ่งขึ้นให้ทำดังนี้:

  1. สร้างฟังก์ชั่นสากลดังนี้

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. จากนั้นใช้ในตัวควบคุมมุมมองดังนี้:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

แฮ็คธรรมดาจาก iOS6 ทำงานบน iOS7 ด้วย:

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

แก้ไข: อย่าใช้แฮ็คนี้ ดูความคิดเห็นเพื่อดูรายละเอียด


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

มีปัญหาเกี่ยวกับอุปกรณ์เท่านั้นไม่ใช่ตัวจำลอง
จ้ะ

แฮ็คนี้ใช้งานไม่ได้อีกต่อไปเมื่อสร้างด้วย Xcode 9 / iOS 11 ตัว "<" จะปรากฏต่ำเกินไปและคุณจะเห็นข้อ จำกัด ที่แตกหักเมื่อทำงานในดีบักเกอร์
T'Pol

3

คุณสามารถใช้สิ่งนี้ นี้ทำงานได้อย่างสมบูรณ์แบบสำหรับผมโดยเพียงแค่เพิ่มUIButtonเป็น custumview UIBarButtonItemสำหรับที่

ลองรหัสด้านล่าง

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}

3
อย่างไรก็ตามสิ่งนี้จะปิดใช้งานการปัดนิ้วกลับใน iOS 7
user102008

3

สร้างชื่อที่คุณต้องการสำหรับควบคุมดูรากของคุณและกำหนดให้มุมมองของตัวควบคุมUILabelnavigationItem.titleView

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

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

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

นี่คือวิธีการที่ใช้เมธอด swizzling เพียงแค่สร้างส่วนขยายใหม่ไปที่ UINavigationItem

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

ตั้งปุ่มย้อนกลับเป็นคำกลับใช้งานได้ดี: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel

คุณหมายถึงคู่ชีวิต? คำถามเกี่ยวกับการนำข้อความออกจากปุ่มย้อนกลับ?
jakub wolanski

1
แอพจำนวนมากและแอปของ Apple บอกว่า "<ย้อนกลับ" ดังนั้นจึงเป็นเรื่องดีที่จะยึดติดอยู่กับมาตรฐาน BigTakeAway และ JustEat
Mike Zriel

2

ฉันใช้รหัสต่อไปนี้ใน viewDidLoad และใช้งานได้:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

เพียงแค่อัปเดตฉันใช้ Vector Icon


2

คุณสามารถ subclass UINavigationController ตั้งค่าตัวเองเป็นผู้รับมอบสิทธิ์และตั้ง backBarButtonItem ในวิธีการมอบหมาย navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

ตั้งค่าชื่อหลังว่าง

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

เปลี่ยนภาพด้านหลัง

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

ฉันใช้โซลูชันนี้ตั้งแต่ iOS 5 ขึ้นไปโดยไม่มีปัญหาใด ๆ ฉันสร้างฟังก์ชันอรรถประโยชน์ที่ฉันเรียกใช้ในตัวควบคุมมุมมองของฉัน คุณต้องทำอย่างใดอย่างหนึ่งใน viewDidLoad หรือจุดใด ๆ หลังจากนั้น

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

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


1
นี่คือคำตอบที่ถูกต้อง ไม่มีลูกเล่น นี่เป็นเพียงการใช้ iOS API ตามที่ตั้งใจไว้เพื่อตั้งชื่อ ตั้งเป็น @ "" เพื่อลบชื่อ (ผ่านการทดสอบและใช้งานได้ดี)
n13

1

วิธีเดียวที่ได้ผลสำหรับฉันคือ:

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

UPDATE:

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

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

1

หากคุณมี ViewController สองตัว (FirstVC, SecondVC) ฝังอยู่ใน Navigation Controller และคุณต้องการให้มีลูกศรย้อนกลับใน SecondVC

คุณสามารถลองสิ่งนี้ได้ใน ViewDidLoad ของ FirstVC

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

จากนั้นเมื่อคุณดันเข้าไปที่ SecondVC คุณจะเห็นว่ามีลูกศรย้อนกลับเท่านั้น


1

หากคุณตั้งค่า tintColor Of NavigationBar ให้เพิ่มรูปภาพปุ่มย้อนกลับที่กำหนดเองโดยไม่มีชื่อสีสีจะสะท้อนสีของภาพ โปรดติดตามลิงค์เอกสารของ apple นี้

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];

1

ตรวจสอบคำตอบนี้

จะเปลี่ยนชื่อปุ่มย้อนกลับของ UINavigationController ได้อย่างไร?

ตั้งค่าtitleข้อความstringด้วยช่องว่างหนึ่งช่องด้านล่าง

title = " "

ไม่มีชื่อเสียงเพียงพอที่จะเพิ่มความคิดเห็น :)


1

ฉันเขียนส่วนขยายเพื่อทำให้ง่ายขึ้น:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

คุณสามารถเปลี่ยนชื่อเป็น @ "" ของ ViewController ปัจจุบันบน viewWillDisappear และเมื่อมันกำลังจะแสดงอีกครั้งตั้งชื่อเป็นสิ่งที่มันเป็นมาก่อน

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

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

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

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

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

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


ดูคำตอบของฉันสำหรับคำตอบที่ถูกต้องโดยไม่ยุ่งกับหัวข้อรายการการนำทาง
Dima

โซลูชันของคุณใช้ลูกศรย้อนกลับของ iOS7 หรือไม่? ฉันลองสิ่งที่คล้ายกัน แต่มันลบลูกศรออก
Alejandro Figueroa

มันทำให้ลูกศรย้อนกลับใน iOS 7 ใช่ ใน iOS 6 ผ่านในสตริงว่าง (ความยาว 0) จะลบปุ่มอย่างสมบูรณ์แม้ว่าการทำเช่นนี้จะดีสำหรับ iOS 7 เท่านั้น
Dima

มีทางออกที่ง่ายมาก ดูว่าคำตอบของฉันเหมาะกับคุณหรือไม่
Guto Araujo

0

ในการเพิ่มคำตอบของ Thomas Cข้างต้นบางครั้งการวางช่องว่างเดียวไม่ทำงานและคุณต้องเพิ่มช่องว่างต่อไป

ปุ่มแถบว่างเปล่า

คุณจะรู้ว่าคุณประสบความสำเร็จเมื่อคุณเห็น "รายการปุ่มบาร์ -" ใต้ "รายการนำทาง" ที่อยู่ใน Document Outline (Editor-> Show Document เค้าร่าง) เมื่อคุณเห็นภาพด้านบนคุณสามารถลบช่องว่างเล็กน้อยและดูว่ายังใช้งานได้หรือไม่


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

เช่นเดียวกับ Kyle Begeman คุณเพิ่มรหัสด้านบนที่รูทตัวควบคุมรูทของคุณ ตัวควบคุมมุมมองย่อยทั้งหมดจะถูกนำไปใช้ นอกจากนี้การเพิ่มสิ่งนี้ในวิธี

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