Làm cách nào để ẩn nút quay lại trên mạng trong UINavestionControll?


158

Bạn có biết cách ẩn nút 'quay lại' trong UINavestionControll không? Ngoài ra, làm thế nào để hiển thị lại, nhưng tôi đoán nó rất giống với việc che giấu nó ...

Giống như ứng dụng thư thực hiện trên iPhone khi bạn nhấn 'Chỉnh sửa' trong khi xem email.

Câu trả lời:


313

Tôi vừa tìm ra câu trả lời, trong một bộ điều khiển sử dụng điều này:

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

Và để khôi phục nó:

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

-

[CẬP NHẬT]

Swift 3.0:

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

18
Cũng học hỏi từ sai lầm của tôi: bạn phải gọi setHidesBackButton:TRƯỚC KHI bạn đẩy navigationItem vào navigationContoder.
mã hóaFriend1

tại sao trước đây Còn nếu bạn muốn đẩy viewContoder và sau đó ẩn nút quay lại để ngăn người dùng quay lại thì sao?
dùng4951

1
@codingFriend - Tôi thấy rằng điều này cũng hoạt động nếu bạn đặt setHidesBackButton trong trình xử lý thông báo viewDidAppear của chế độ xem mà bạn không muốn hiển thị nút bấm trên.
Anon

2
Các sự kiện tốt nhất cho việc này là viewWillAppear:animatedđể ẩn và viewWillDisappear:animatedkhôi phục nó.
pechar

Cuối cùng, một cái gì đó Apple đã không thay đổi trong Xcode. Hơn 5 năm sau và câu trả lời này vẫn hoạt động tuyệt vời.
Ứng dụng Dev Guy


22

Ngoài việc loại bỏ nút quay lại (sử dụng các phương pháp đã được đề xuất), đừng quên người dùng vẫn có thể 'bật' sang màn hình trước đó bằng cử chỉ vuốt từ trái sang phải trong iOS 7 trở lên.

Để vô hiệu hóa điều đó (khi thích hợp), hãy thực hiện như sau (ví dụ trong viewDidLoad):

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

1
Matt - +1 cho bạn. Cảm ơn bạn đã thêm ghi chú này. Rất hữu ích. Đối với bất cứ ai đang tự hỏi làm thế nào cử chỉ pop hoạt động, chỉ cần vuốt từ trái sang phải trên thanh điều hướng của bạn để tạo lại những gì Matt đang mô tả ở đây. Thêm mã ở trên ngăn người dùng thực hiện việc này trên trình điều khiển xem nơi nó được bao gồm.
noobzilla

18

Chỉ cần làm rõ các câu trả lời hiện có: hidesBackButtontài sản là câu trả lời đúng, nhưng không rõ ràng trong nhiều câu trả lời selfđề cập đến. Về cơ bản, bạn nên đặt self.navigationItem.hidesBackButton = YEStrong trình điều khiển chế độ xem sắp bị đẩy (hoặc vừa bị đẩy) lên UINavigationController.

Nói cách khác, nói rằng tôi có một cái UINavigationControllertên myNavController. Tôi muốn đặt một chế độ xem mới cho nó và khi tôi không muốn nút quay lại hiển thị nữa. Tôi có thể làm một cái gì đó như:

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];

Khi mã kết thúc, chế độ xem được điều khiển bởi newVCbây giờ sẽ hiển thị và không hiển thị nút quay lại.


Chính xác những gì tôi cần khi lần đầu tiên thực hiện NavigationContoder.NavlationItem. Cảm ơn Matt.
Chucky

16

Để ẩn và hiển thị nút Quay lại một cách có điều kiện, bạn có thể sử dụng mã sau:

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

Lưu ý: trong một số trường hợp, bạn phải đặt nó trong phương thức viewDidAppear thay vì viewWillAppear các trường hợp như: khi bạn đang cập nhật mảng của lớp tiếp theo vào lớp trước và sau đó kiểm tra điều kiện vào lớp tiếp theo như trên.


11

Swift iOS (Tôi đã sử dụng sau)

// 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 không hoạt động với tôi vì một số lý do

Tôi đã sử dụng cách này ->

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

cảm ơn .. Tôi đã gặp vấn đề tương tự khi setHidesBackButton: CÓ không hoạt động. nhưng giải pháp này đã hoạt động cho iOS 7.
mohsinj


6

Trong trường hợp của tôi, tôi đã có một vài vấn đề với câu trả lời hiện tại:

  • bên trong viewDidLoad / viewWillAppear chỉ biểu tượng quay lại bị ẩn và chuỗi "Quay lại" không hoạt động nhưng vẫn hiển thị
  • bên trong viewDidAppear nút quay lại biến mất ... nhưng tôi không muốn người dùng nhìn thấy nó

Vì vậy, giải pháp cuối cùng đã có hiệu quả với tôi là:

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

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

    return self;
}

3

Giải pháp được đề xuất bởi Zoran Simic đã không làm việc cho tôi vì một số lý do.

Mã này đã làm việc tuy nhiên:

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

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

[controller release];

Rõ ràng là bạn phải điều khiển NSArray theo sở thích của mình để khiến nó hoạt động cho bạn. Mong rằng sẽ giúp được ai đó :)


Cảm ơn vì điều đó! Tôi đã chiến đấu với một lỗi kỳ lạ và điều này đã tạo ra mánh khóe. Không phải cho tất cả mọi người, nhưng hữu ích trong các trường hợp đúng.
Brandon

1

Trong lớp con UIViewControll của tôi, tôi có phương thức này:

-(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

Thao tác này sẽ ẩn nút quay lại và thay thế bằng nút thêm trong 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

Swift 3.

Nói chung, bạn nên sử dụng API per-ViewControll của Apple như được mô tả nhiều lần trên trang này, nhưng đôi khi bạn cần kiểm soát ngay lập tức nút Quay lại.

Đoạn mã sau ẩn nút Quay lại và đảm bảo rằng phát hiện va chạm chạm không xảy ra trong vùng nút ẩn.

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

0

Điều này ẩn nút quay lại

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


navigationItem.leftBarButtonItem = backBtn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.