Làm cách nào để hiển thị / ẩn UIBarButtonItem?


251

Tôi đã tạo một thanh công cụ trong IB với một số nút. Tôi muốn có thể ẩn / hiển thị một trong các nút tùy thuộc vào trạng thái của dữ liệu trong cửa sổ chính.

UIBarButtonItem không có thuộc tính ẩn và bất kỳ ví dụ nào tôi tìm thấy cho đến nay để ẩn chúng liên quan đến việc đặt các nút thanh điều hướng thành không, điều mà tôi không nghĩ là tôi muốn làm ở đây vì tôi có thể cần hiển thị lại nút (không phải để đề cập đến điều đó, nếu tôi kết nối nút của mình với IBOutlet, nếu tôi đặt nó thành không thì tôi không chắc mình sẽ lấy lại được như thế nào).


Tôi chỉ đơn giản là vô hiệu hóa nó và thêm nhãn khả năng truy cập nói rằng tính năng của nút không khả dụng.
Daniel Springer

Câu trả lời:


263

Lưu nút của bạn trong một ổ cắm mạnh (hãy gọi nó myButton) và làm điều này để thêm / xóa nó:

// Get the reference to the current toolbar buttons
NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy];

// This is how you remove the button from the toolbar and animate it
[toolbarButtons removeObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];

// This is how you add the button to the toolbar and animate it
if (![toolbarButtons containsObject:self.myButton]) {
    // The following line adds the object to the end of the array.  
    // If you want to add the button somewhere else, use the `insertObject:atIndex:` 
    // method instead of the `addObject` method.
    [toolbarButtons addObject:self.myButton];
    [self setToolbarItems:toolbarButtons animated:YES];
}

Bởi vì nó được lưu trữ trong ổ cắm, bạn sẽ giữ một tham chiếu đến nó ngay cả khi nó không có trên thanh công cụ.


73
Để thực hiện công việc này cho nút bên phải của tôi trong Bộ điều khiển điều hướng, tôi đã sử dụng self.navlationItem.rightBarButtonItems và [self.navlationItem setRightBarButtonItems <prams>] thay cho toolBarItems và setToolBarItems.
MindSpiker

@MindSpiker: Vâng, anh ấy cũng làm việc với các nút trên thanh điều hướng.
lnafziger

1
Tôi có phải nil myButton trong dealloc không?
Văn Du Trần

48
Hoặc Apple có thể vừa thêm tài sản .hidden. -_-
GeneCode

217

Tôi biết câu trả lời này là muộn cho câu hỏi này. Tuy nhiên, nó có thể giúp nếu bất cứ ai khác phải đối mặt với một tình huống tương tự.

Trong iOS 7, để ẩn một mục nút thanh, chúng ta có thể sử dụng hai kỹ thuật sau: -

  • sử dụng SetTitleTextAttributes: - Điều này hoạt động rất tốt trên các mục nút thanh như "Xong", "Lưu", v.v. Tuy nhiên, nó không hoạt động trên các mục như Thêm, biểu tượng Thùng rác, v.v. (ít nhất là đối với tôi) vì chúng không phải là văn bản.
  • sử dụng TintColor: - Nếu tôi có một mục nút thanh gọi là "xóaButton": -

Để ẩn nút, tôi đã sử dụng mã sau: -

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];

Để hiển thị nút một lần nữa, tôi đã sử dụng đoạn mã sau: -

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];

[self.navlationItem.rightBarButtonItem setEnables: NO]; [self.navlationItem.rightBarButtonItem setTintColor: [UIColor ClearColor]];
Leon

3
Đối với Swift: deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()để vô hiệu hóa và ẩn, đồng deleteButton.enabled = true; deleteButton.tintColor = nilthời bật lại và hiển thị như bình thường.
Unixmonkey

1
Tôi thích cách tiếp cận này cho phép tôi đặt logic cho việc có hiển thị UIBarButton bên trong lớp đó hay không. Lý do nó chỉ hoạt động với một nút không rõ ràng ngay lập tức - bởi vì nếu bạn ẩn một nút theo cách này, nó sẽ vẫn chiếm dung lượng, do đó bạn có thể có một khoảng trống nếu bạn có nhiều nút.
SimplGy

Cách tiếp cận đầu tiên của bạn là hoàn hảo cho tôi. Tôi đặt UIColor.clearcho UIControlState.disabledvà có thể hiển thị / ẩn nút với setEnabled. Tất nhiên như bạn đã nêu, điều này chỉ hoạt động cho các nút văn bản.
fl034

Nếu tôi nhấn nó lâu cho đến khi nó hiện lên trong một hình ảnh lớn (có thể là khả năng truy cập) thì ngay cả với isEnables được đặt thành false, nó vẫn hoạt động.
Daniel Springer

67

Đây là một cách tiếp cận đơn giản:

hide:  barbuttonItem.width = 0.01;
show:  barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)

Tôi chỉ chạy nó trên iPad võng mạc của tôi và .01 đủ nhỏ để nó không hiển thị.


13
Trong tất cả các giải pháp, giải pháp này nhanh chóng, bẩn và hiệu quả. Tôi cũng đã thêm barbuttItem.enables = NO; vì tôi vẫn có thể bật nút nếu tôi nhấn đủ.
Stickley

1
Không làm việc cho tôi. Tôi nghĩ rằng đó là vì tôi đang sử dụng nút Thêm với hình ảnh '+', nhưng tôi đã thử một nút Tùy chỉnh với văn bản "Mới" và nó vẫn không biến mất. Sự thay đổi hỗ trợ để tôi biết mã của tôi đang được thực thi. Có ý kiến ​​gì không? Lưu ý rằng nút này được tạo trong bảng phân cảnh và có phân biệt nên tôi không muốn thay đổi thành nút lập trình thay vào đó
hoàng

19
Nó dường như không hoạt động trong một thanh công cụ điều khiển điều hướng, nhưng nó làm cho các thanh công cụ khác.
Drew Rosenberg

3
Nó che giấu nó nhưng nó vẫn phản ứng với vòi. Đối với tôi nó hoạt động như một nút vô hình.
Tibidabo

Nếu bạn đã đặt màu sắc toàn cầu bằng cách sử dụng dòng này self.window?.tintColor = APP_PRIMARY_COLORtrong appdelegate, thì nó sẽ không hoạt động
Mehul Thakkar

60

Có thể ẩn một nút tại chỗ mà không thay đổi chiều rộng của nó hoặc loại bỏ nó khỏi thanh. Nếu bạn đặt kiểu thành đơn giản, xóa tiêu đề và tắt nút, nó sẽ biến mất. Để khôi phục nó, chỉ cần đảo ngược những thay đổi của bạn.

-(void)toggleBarButton:(bool)show
{
    if (show) {
        btn.style = UIBarButtonItemStyleBordered;
        btn.enabled = true;
        btn.title = @"MyTitle";
    } else {
        btn.style = UIBarButtonItemStylePlain;
        btn.enabled = false;
        btn.title = nil;
    }
}

2
Điều này làm việc cho tôi bằng cách đơn giản là đặt btn.title = nil. Tôi cũng đang bật enable = KHÔNG, chỉ trong trường hợp ...
Thịt lợn 'n' Bunny

3
Đặt nútItem.title thành nil không hoạt động với tôi trong iOS7. Nút không xuất hiện lại khi đặt lại. Tuy nhiên, những gì đã làm là cài đặt buttonItem.title = @ "";
Đánh dấu Knopper

42

Dưới đây là giải pháp của tôi mặc dù tôi đã tìm nó cho Navigation Bar.

navBar.topItem.rightBarButtonItem = nil;

Ở đây "navBar" là một IBOutlet cho NavigationBar trong chế độ xem trong XIB Ở đây tôi muốn ẩn nút hoặc hiển thị nó dựa trên một số điều kiện. Vì vậy, tôi đang kiểm tra điều kiện trong "Nếu" và nếu đúng, tôi đang cài đặt nút thành không trong phương thức viewDidLoad của chế độ xem đích.

Điều này có thể không liên quan chính xác đến vấn đề của bạn nhưng điều gì đó tương tự xảy ra nếu bạn muốn ẩn các nút trên NavigationBar


Nếu sau đó bạn muốn đặt rightBarButtonItemlại, hãy đảm bảo mục nút được lưu trữ trong IBOutlet mạnh để nó không bị giải phóng khi bạn tháo nó ra khỏi thanh điều hướng.
Nate

30

Đối với Swift 3 và Swift 4, bạn có thể làm điều này để ẩn UIBarButtomItem:

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear

Và để hiển thị UIBarButtonItem:

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue

Trên tintColorbạn phải xác định màu gốc bạn đang sử dụng choUIBarButtomItem


2
Nhưng điều này vẫn sẽ chiếm không gian cho nút này.
Makalele

22

Tôi hiện đang chạy OS X Yosemite Developer Preview 7 và Xcode 6 beta 6 nhắm mục tiêu iOS 7.1 và giải pháp sau đây hoạt động tốt với tôi:

  • Tạo ổ cắm cho UINavigationItemUIBarButtonItems
  • Chạy mã sau để loại bỏ

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • Chạy các mã sau để thêm nút một lần nữa

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];

Cảm ơn, đây là phương pháp tốt nhất mà tôi đã tìm thấy. Chỉ cần chắc chắn rằng tài liệu tham khảo của bạn đến các nút của bạn là mạnh mẽ.
jyoung

Ngoài ra, hãy nhớ rằng điều này chỉ hoạt động nếu bạn chỉ có một nút ở đó. Ví dụ sẽ loại bỏ TẤT CẢ các nút ở bên đó.
lnafziger

@jyoung Điều này làm việc cho tôi, nhưng tại sao nó lại quan trọng nếu tham chiếu mạnh? Tôi đã không thử theo cách khác, nhưng thường không đặt theo cách đó vì nó không phải là mặc định.
Robert

@Robert Bạn muốn sử dụng đối tượng sau, vì vậy bạn cần đảm bảo đối tượng không nhận được rác được thu thập khi bạn đặt nó thành không. Nếu không có gì khác giữ lại đối tượng khi bạn nói với mục nút thanh thì bạn có thể thoát khỏi nó, số tham chiếu sẽ là 0 và nó sẽ được thu gom rác.
jyoung

14

Tôi đã sử dụng IBOutlets trong dự án của tôi. Vì vậy, giải pháp của tôi là:

@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()

Và khi bạn cần hiển thị lại thanh này, chỉ cần đặt thuộc tính đảo ngược.

Trong Swift 3 thay vì enablesử dụng isEnabletài sản.



12

iOS 8. UIBarButtonItem với hình ảnh tùy chỉnh. Đã thử nhiều cách khác nhau, hầu hết đều không giúp được gì. Giải pháp tối đa,setTintColor không thay đổi thành bất kỳ màu nào. Tôi tự mình tìm ra cái này, nghĩ rằng nó sẽ có ích với ai đó.

Để che giấu:

[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];

Để hiển thị:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];

9

Hãy thử trong Swift , đừng cập nhậttintColor nếu bạn có một số thiết kế cho UIBarButtonItem như kích thước phông chữ trong AppDelegate, nó sẽ thay đổi hoàn toàn giao diện của nút của bạn khi hiển thị.

Trong trường hợp có nút văn bản, việc thay đổi tiêu đề có thể để nút của bạn 'biến mất'.

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}

7

Tôi phát hiện ra một nếp nhăn ở tintColorisEnabledphương pháp tiếp cận được đề xuất bởi Max và những người khác - khi VoiceOver được kích hoạt cho khả năng tiếp cận và nút được một cách logic ẩn, con trỏ khả năng tiếp cận vẫn sẽ tập trung vào nút thanh, và tuyên bố rằng đó là "mờ" (tức là bởi vì isEnabledlà đặt thành sai). Cách tiếp cận trong câu trả lời được chấp nhận không bị ảnh hưởng bởi tác dụng phụ này, nhưng một công việc khác mà tôi thấy là đặt isAccessibilityElementthành sai khi "ẩn" nút:

deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false

Và sau đó thiết lập isAccessibilityElementtrở lại đúng khi "hiển thị" nút:

deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true

Có mục nút thanh vẫn chiếm không gian không phải là vấn đề trong trường hợp của tôi, vì chúng tôi đã ẩn / hiển thị hầu hết các mục nút bên phải.


6
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}

Và bây giờ chỉ cần thay đổi isHiddentài sản.


5

Cải thiện từ câu trả lời @lnafziger

Lưu Barbuttons của bạn trong một ổ cắm mạnh và làm điều này để ẩn / hiển thị nó:

-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you remove the button from the toolbar and animate it
    [navBarBtns removeObject:myButton];
    [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}


-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you add the button to the toolbar and animate it
    if (![navBarBtns containsObject:myButton]) {
        [navBarBtns addObject:myButton];
        [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
    }
}

Khi cần sử dụng bên dưới Chức năng ..

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];

5

Chỉ cần đặt barButton.customView = UIView()và xem Trick


Những gì câu trả lời này làm, là cho phép tất cả các kích thước linh hoạt để làm việc. Đó thực sự là một câu trả lời siêu hiệu quả. Có lẽ cùng với một phần mở rộng nó sẽ hoàn hảo.
Adrian_H

4

Không có cách nào để "ẩn" một UIBarButtonItem bạn phải xóa nó khỏi superView và thêm lại khi bạn muốn hiển thị lại.


Điều này thực sự không đúng - phương pháp được mô tả bởi Max hoạt động tốt.
miền bắc

1
công cụ - Max không thực sự chính xác. Anh ta không thực sự che giấu nút theo cách mà hầu hết mọi người sẽ định nghĩa "ẩn". Anh ta chỉ đơn giản là làm cho nó không hiển thị và vô hiệu hóa tương tác người dùng. Nút vẫn còn đó và chiếm không gian. Nó liên quan đến cách bạn muốn xác định "ẩn", tôi tin rằng tinh thần của câu hỏi ban đầu là thực sự muốn xóa / thêm nó, không chỉ làm cho nó vô hình.
Michael Peterson

4

Đây là cách dài trong danh sách câu trả lời, nhưng chỉ trong trường hợp ai đó muốn sao chép và dán dễ dàng cho giải pháp nhanh chóng, đây là

func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
    toolbar.setItems(toolbarButtons, animated: true)
}

func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    if !toolbarButtons.contains(button) {
        toolbarButtons.insert(button, atIndex: index)
        toolbar.setItems(toolbarButtons, animated:true);
    }
}

Không tệ nhưng bạn phải cung cấp một tham số UINavestionItem và không phải UIToolbar vì anh ta yêu cầu ẩn UIBarButtonItem. Tôi đã sửa đổi chức năng của bạn thành cái này: func hideToolbarItem (nút: UIBarButtonItem, thanh công cụ withToolbar: UINavlationItem) {var thanh công cụ toolbarButtons.removeAtIndex (toolbarButtons.indexOf (nút)!) toolbar.setRightBarButtonItems (toolbarButtons, hoạt hình: true)} và hoạt động tuyệt vời
Kingalione

3

Một cách để làm điều đó là sử dụng initWithCustomView:(UIView *)tài sản của khi phân bổ UIBarButtonItem. Phân lớp choUIView sẽ có tài sản ẩn / bỏ ẩn.

Ví dụ:

1. Có mộtUIButton cái mà bạn muốn ẩn / bỏ ẩn.

2. Thực hiện UIButtonnhư chế độ xem tùy chỉnh. Giống :

UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button

UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];

3. Bạn có thể ẩn / bỏ ẩn những myButtongì bạn đã tạo.[myButton setHidden:YES];


Tuy nhiên, nó sẽ không thu hẹp khoảng cách giữa các nút khác: Khi nó bị "ẩn", sẽ có một vùng trống trên thanh công cụ.
lnafziger

@lnafziger Đúng vậy, nhưng tôi đã không đọc OP đề cập đến việc thu hẹp khoảng cách giữa các nút, nhưng đây là một điểm tốt cần lưu ý.
iNoob

1
Cảm ơn, câu trả lời của bạn cũng hữu ích, nhưng tôi nghĩ rằng hầu hết mọi người khi họ muốn ẩn một nút trên thanh công cụ đều muốn nó trông giống như không có ở đó (không có khu vực trống). Nếu đó là bên trái hay bên phải, điều đó thực sự không quan trọng.
lnafziger

Điểm hay, iNoob và Inafziger - Tôi cũng không đề cập đến nó nhưng vâng, tôi muốn rằng không có một chỗ trống.
Sasha

3

Đối với phiên bản Swift, đây là mã:

Dành cho UINavigationBar:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil

2

Đặt màu văn bản thành màu rõ ràng khi mục nút thanh bị tắt có lẽ là một tùy chọn sạch hơn. Không có gì lạ mà bạn phải giải thích trong một bình luận. Ngoài ra, bạn không phá hủy nút để bạn vẫn giữ bất kỳ phân biệt bảng phân cảnh liên quan.

[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
                                                      forState:UIControlStateDisabled];

Sau đó, bất cứ khi nào bạn muốn mục nút thanh bị ẩn, bạn chỉ có thể làm:

self.navigationItem.rightBarButton.enabled = NO;

Thật khập khiễng không có tài sản ẩn nhưng điều này mang lại kết quả tương tự.


1
Tôi đã có một nút bên trongBarButtonItem. Vì vậy, tôi đặt kích hoạt thành NO và thay đổi hình ảnh của nó ở trạng thái bị vô hiệu thành không. Làm việc như một cơ duyên ... Cảm ơn
Skywalker

ý tưởng tuyệt vời, tuy nhiên việc đặt hình ảnh thành null không hiệu quả với tôi, tôi đã phải đặt một hình vuông nhỏ trong suốt 20x20 làm hình ảnh
Lena Bru

2

Trong trường hợp UIBarButtonItem có hình ảnh thay vì văn bản trong đó, bạn có thể làm điều này để ẩn nó: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;


2

Một số phương pháp trợ giúp tôi nghĩ tôi muốn chia sẻ dựa trên câu trả lời được chấp nhận của lnafziger vì tôi có nhiều thanh công cụ và nhiều nút trong mỗi:

-(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    [toolbarButtons removeObject:button];
    [toolbar setItems:toolbarButtons animated:NO];
}

-(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{
    NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
    if (![toolbarButtons containsObject:button]){
        [toolbarButtons insertObject:button atIndex:index];
        [self setToolbarItems:toolbarButtons animated:YES];
    }
}

2

Bạn có thể dễ dàng có được chế độ xem và ẩn nó theo cách này

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true

2

Nếu bạn đang sử dụng Swift 3

if (ShowCondition){
   self.navigationItem.rightBarButtonItem = self.addAsset_btn 
 } 
else {
   self.navigationItem.rightBarButtonItem = nil
 }

2

Đây là một phần mở rộng sẽ xử lý này.

extension UIBarButtonItem {

    var isHidden: Bool {
        get {
            return tintColor == .clear
        }
        set {
            tintColor = newValue ? .clear : .white //or whatever color you want
            isEnabled = !newValue
            isAccessibilityElement = !newValue
        }
    }

}

SỬ DỤNG:

myBarButtonItem.isHidden = true

1

Bổ sung cho phản hồi của Eli Burke, nếu bạn UIBarButtonItemcó hình nền thay vì tiêu đề, bạn có thể sử dụng mã:

-(void)toggleLogoutButton:(bool)show{
    if (show) {
        self.tabButton.style = UIBarButtonItemStyleBordered;
        self.tabButton.enabled = true;
        UIImage* imageMap = [UIImage imageNamed:@"btn_img.png"];
        [((UIButton *)[self.tabButton customView]) setBackgroundImage:imageMap forState:UIControlStateNormal];
    } else {
        self.tabButton.style = UIBarButtonItemStylePlain;
        self.tabButton.enabled = false;
        [((UIButton *)[self.tabButton customView]) setBackgroundImage:nil forState:UIControlStateNormal];
    }
}

0

Bạn cần thao tác mảng thanh công cụ.items.

Đây là một số mã tôi sử dụng để ẩn và hiển thị nút Xong. Nếu nút của bạn nằm ở cạnh cực của thanh công cụ hoặc ở giữa các nút khác, các nút khác của bạn sẽ di chuyển, vì vậy nếu bạn muốn nút của mình biến mất, hãy đặt nút của bạn làm nút cuối cùng về phía trung tâm. Tôi làm động nút di chuyển để có hiệu lực, tôi khá thích nó.

-(void)initLibraryToolbar {

    libraryToolbarDocumentManagementEnabled = [NSMutableArray   arrayWithCapacity:self.libraryToolbar.items.count];
    libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
    [libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
    [libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
    trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
    mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
    [libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
    trashCan.enabled = NO;
    mail.enabled = NO;
    [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];

}

vì vậy bây giờ có thể sử dụng mã sau đây để hiển thị nút của bạn

[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES; 

hoặc để ẩn nút của bạn

[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;

0

Trong IB nếu bạn để trống tiêu đề của nút, nó sẽ không xuất hiện (không bao giờ được khởi tạo?). Tôi làm điều này thường xuyên trong quá trình phát triển trong khi cập nhật giao diện người dùng nếu tôi muốn một mục nút thanh tạm thời biến mất để xây dựng mà không xóa nó và bỏ đi tất cả các tham chiếu ổ cắm của nó.

Điều này không có tác dụng tương tự trong thời gian chạy, đặt tiêu đề của nút thành không sẽ khiến toàn bộ nút biến mất. Xin lỗi không thực sự trả lời câu hỏi của bạn, nhưng có thể hữu ích cho một số người.

Chỉnh sửa: Thủ thuật này chỉ hoạt động nếu kiểu của nút được đặt thành đơn giản


0

Tôi sẽ thêm giải pháp của mình vào đây vì tôi không thể tìm thấy nó được đề cập ở đây. Tôi có một nút động có hình ảnh phụ thuộc vào trạng thái của một điều khiển. Giải pháp đơn giản nhất đối với tôi là đặt hình ảnh nilnếu không có điều khiển. Hình ảnh được cập nhật mỗi lần điều khiển được cập nhật và do đó, điều này là tối ưu đối với tôi. Chỉ cần chắc chắn tôi cũng thiết lập enabledđểNO .

Đặt chiều rộng thành giá trị tối thiểu không hoạt động trên iOS 7.


0

Với tín dụng cho @lnafziger, @MindSpiker, @vishal, et. al

Đơn giản nhất mà tôi đã sử dụng cho một nút thanh bên phải (hoặc bên trái) là:

self.navigationItem.rightBarButtonItem = <#StateExpression#>
    ? <#StrongPropertyButton#> : nil;

Như trong:

@interface MyClass()

@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;

@end

@implementation

- (void) updateState
{
    self.navigationItem.rightBarButtonItem = <#StateExpression#>
        ? <#StrongPropertyButton#> : nil;
}

@end

Tôi đã thử nghiệm điều này và nó hoạt động với tôi (với mục nút thanh mạnh được nối qua IB).


Điều này sẽ hoạt động nếu bạn chỉ có một nút, nhưng nếu bạn có nhiều nút, bạn sẽ cần sử dụng một phương pháp nhiều hơn theo dòng câu trả lời của tôi.
lnafziger
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.