วิธีซ่อนปุ่ม“ ย้อนกลับ” ใน UINavigationController


158

คุณรู้วิธีซ่อนปุ่ม 'ย้อนกลับ' ใน UINavigationController หรือไม่? นอกจากนี้วิธีการแสดงมันกลับ แต่ฉันคิดว่ามันคล้ายกันมากกับการซ่อนมัน ...

เช่นเดียวกับแอปพลิเคชันอีเมลบน iPhone เมื่อคุณกด 'แก้ไข' ในขณะที่ดูอีเมล

คำตอบ:


313

ฉันเพิ่งพบคำตอบในคอนโทรลเลอร์ใช้สิ่งนี้:

[self.navigationItem setHidesBackButton:YES animated:YES];

และเพื่อเรียกคืน:

[self.navigationItem setHidesBackButton:NO animated:YES];

-

[อัปเดต]

สวิฟท์ 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

18
เรียนรู้จากความผิดพลาดของฉันด้วย: คุณต้องโทรหาsetHidesBackButton:ก่อนที่คุณจะผลักดันรายการนำทางลงใน navigationController
codingFriend1

ทำไมก่อน ถ้าคุณต้องการผลักดัน viewController แล้วซ่อนปุ่มย้อนกลับเพื่อป้องกันผู้ใช้จากการย้อนกลับ
user4951

1
@codingFriend - ฉันพบว่าสิ่งนี้ยังใช้งานได้ถ้าคุณใส่ setHidesBackButton ในตัวจัดการข้อความ viewDidAppear ของมุมมองที่คุณไม่ต้องการแสดงปุ่มย้อนกลับ
Anon

2
เหตุการณ์ที่ดีที่สุดสำหรับสิ่งนี้คือviewWillAppear:animatedการซ่อนและviewWillDisappear:animatedกู้คืน
pechar

ในที่สุดสิ่งที่ Apple ไม่ได้เปลี่ยนแปลงใน Xcode มากกว่า 5 ปีต่อมาและคำตอบนี้ยังใช้งานได้ดี
แอพ Dev Guy


22

นอกเหนือจากการลบปุ่มย้อนกลับ (โดยใช้วิธีการที่แนะนำไปแล้ว) อย่าลืมว่าผู้ใช้ยังคงสามารถ 'ป๊อป' ไปยังหน้าจอก่อนหน้าด้วยท่าทางกวาดนิ้วจากซ้ายไปขวาใน iOS 7 และใหม่กว่า

หากต้องการปิดใช้งานนั้น (ตามความเหมาะสม) ให้ใช้ตัวอย่างต่อไปนี้ (ใน viewDidLoad):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;

1
Matt - +1 สำหรับคุณขอบคุณที่เพิ่มบันทึกนี้ มีประโยชน์มาก. สำหรับทุกคนที่สงสัยว่ารูปแบบการเคลื่อนไหวของป๊อปอัพเพียงแค่ปัดจากซ้ายไปขวาบนแถบนำทางของคุณเพื่อสร้างสิ่งที่ Matt อธิบายไว้ที่นี่ การเพิ่มโค้ดด้านบนทำให้ผู้ใช้ไม่สามารถทำสิ่งนี้ได้ในตัวควบคุมมุมมองที่รวมอยู่
noobzilla

18

เพียงชี้แจงคำตอบที่มีอยู่: hidesBackButtonคุณสมบัติเป็นคำตอบที่ถูกต้อง แต่ยังไม่ชัดเจนในคำตอบมากมายที่selfอ้างถึง โดยทั่วไปคุณควรตั้งself.navigationItem.hidesBackButton = YESในการควบคุมมุมมองที่เป็นเรื่องเกี่ยวกับที่จะได้รับการผลักดัน (หรือเพียงแค่มีการผลักดัน) UINavigationControllerลงบน

ในคำอื่น ๆ บอกว่าผมมีชื่อUINavigationController myNavControllerฉันต้องการใส่มุมมองใหม่ลงไปและเมื่อฉันฉันไม่ต้องการให้ปุ่มย้อนกลับแสดงอีกต่อไป ฉันสามารถทำสิ่งที่ชอบ:

UIViewController *newVC = [[UIViewController alloc] init];
//presumably would do some stuff here to set up the new view controller
newVC.navigationItem.hidesBackButton = YES;
[myNavController pushViewController:newVC animated:YES];

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


สิ่งที่ฉันต้องการในขณะที่ฉันกำลังใช้ NavigationController.NavigationItem เป็นครั้งแรก ขอบคุณแมตต์
Chucky

16

สำหรับการซ่อนและแสดงปุ่มย้อนกลับตามเงื่อนไขคุณสามารถใช้รหัสต่อไปนี้:

-(void)viewDidAppear:(BOOL)animated
{
    if ([tempAry count]==0)
    {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    }
    else
    {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];
} 

หมายเหตุ: ในบางกรณีคุณต้องใส่ไว้ในวิธี viewDidAppear แทน viewWillAppear กรณีเช่น: เมื่อคุณกำลังอัปเดตอาร์เรย์ของคลาสถัดไปในคลาสก่อนหน้าจากนั้นตรวจสอบเงื่อนไขในคลาสถัดไปข้างต้น


11

Swift iOS (ฉันใช้ตาม)

// hide back button
        self.navigationItem.setHidesBackButton(true, animated: false)

// pgrm mark ----- ------

    // hide the back button for this view controller

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        self.navigationItem.setHidesBackButton(editing, animated: animated)

    }// end setEditing

10

sethidesbackbutton ไม่ทำงานสำหรับฉันด้วยเหตุผลบางอย่าง

ฉันใช้วิธีนี้ ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;

ขอบคุณ .. ฉันมีปัญหาเดียวกันกับที่ setHidesBackButton: ใช่ไม่ทำงาน แต่วิธีนี้ใช้ได้กับ iOS 7
mohsinj

7

ใช้ Apple Documentation เสมอสำหรับปัญหาง่าย ๆ ที่ตรงไปตรงมาและมีน้ำหนักเบา :)

นี่คือไวยากรณ์สำหรับ Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

การอ้างอิง

https://developer.apple.com/reference/uikit/uinavigationitem#//apple_ref/occ/instm/UINavigationItem/setHidesBackButton:animated:


ลบ; ใน Swift :)
Markus Rautopuro

6

ในกรณีของฉันฉันมีปัญหาเล็กน้อยกับคำตอบปัจจุบัน:

  • ภายใน viewDidLoad / viewWillAppear เฉพาะไอคอนย้อนกลับถูกซ่อนอยู่และสตริง "Back" ไม่ทำงาน แต่ยังคงมองเห็นได้
  • ข้างใน viewDid ปรากฏปุ่มย้อนกลับหายไป ... แต่ฉันไม่ต้องการให้ผู้ใช้เห็นเลย

ดังนั้นทางออกที่ได้ผลสำหรับฉันในที่สุดก็คือ:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        [self.navigationItem setHidesBackButton:YES animated:NO];
    }

    return self;
}

3

วิธีแก้ปัญหาที่แนะนำโดย Zoran Simic ไม่ได้สำหรับฉันด้วยเหตุผลบางอย่าง

รหัสนี้ทำงานอย่างไร:

MyController* controller   =   [[MyController alloc]  init];
NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];

[self.navigationController setViewControllers:array animated:NO];

[controller release];

เห็นได้ชัดว่าคุณต้องจัดการ NSArray ให้เข้ากับรสนิยมของคุณเพื่อให้มันใช้ได้ผลสำหรับคุณ หวังว่าจะช่วยให้ใครบางคน :)


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

1

ในคลาสย่อย UIViewController ของฉันฉันมีวิธีนี้:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated: animated];

    // hide back button in edit mode
    [self.navigationItem setHidesBackButton:editing animated:YES];
}

0

ปุ่มนี้ซ่อนปุ่มย้อนกลับและแทนที่ด้วยปุ่มเพิ่มใน Swift:

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // This hides the back button while in editing mode, which makes room for an add item button
    self.navigationItem.setHidesBackButton(editing, animated: animated)

    if editing {
        // This adds the add item button
        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
        // Use the animated setter for the left button so that add button fades in while the back button fades out
        self.navigationItem.setLeftBarButton(addButton, animated: animated)
        self.enableBackGesture(enabled: false)
    } else {
        // This removes the add item button
        self.navigationItem.setLeftBarButton(nil, animated: animated)
        self.enableBackGesture(enabled: true)
    }
}

func enableBackGesture(enabled: Bool) {
    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
    if let navigationController = self.navigationController {
        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
            interactivePopGestureRecognizer.isEnabled = enabled
        }
    }
}

0

สวิฟท์ 3

โดยทั่วไปคุณควรใช้ Apple per-ViewController API ตามที่อธิบายไว้หลายต่อหลายครั้งในหน้านี้ แต่บางครั้งคุณจำเป็นต้องควบคุมปุ่ม Back ทันที

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

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)

0

ปุ่มนี้ซ่อนปุ่มย้อนกลับ

let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)


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