Bagaimana cara menampilkan / menyembunyikan UIBarButtonItem?

251

Saya membuat toolbar di IB dengan beberapa tombol. Saya ingin dapat menyembunyikan / menampilkan salah satu tombol tergantung pada keadaan data di jendela utama.

UIBarButtonItem tidak memiliki properti tersembunyi, dan contoh apa pun yang saya temukan sejauh ini untuk menyembunyikannya melibatkan pengaturan tombol nav bar hingga nil, yang menurut saya tidak ingin saya lakukan di sini karena saya mungkin perlu menunjukkan tombol itu lagi (tidak untuk menyebutkan itu, jika saya menghubungkan tombol saya ke IBOutlet, jika saya setel ke nil saya tidak yakin bagaimana saya mendapatkannya kembali).

Sasha
sumber
Saya cukup menonaktifkannya dan menambahkan label aksesibilitas yang mengatakan fitur tombol tidak tersedia.
Daniel Springer

Jawaban:

263

Simpan tombol Anda di outlet yang kuat (sebut saja myButton) dan lakukan ini untuk menambah / menghapusnya:

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

Karena disimpan di outlet, Anda akan tetap referensi meskipun tidak ada di toolbar.

lnafziger
sumber
73
Untuk membuat ini berfungsi untuk tombol kanan saya dalam pengontrol Navigasi saya menggunakan self.navigationItem.rightBarButtonItems dan [self.navigationItem setRightBarButtonItems <prams>] alih-alih toolBarItems dan setToolBarItems.
MindSpiker
@MindSpiker: Ya, dia teknik yang sama juga berfungsi untuk tombol pada bilah navigasi.
lnafziger
1
apakah saya harus mematikan myButton di dealloc?
Van Du Tran
48
Atau Apple bisa saja menambahkan .hidden property. -_-
GeneCode
217

Saya tahu jawaban ini terlambat untuk pertanyaan ini. Namun, mungkin membantu jika ada orang lain yang menghadapi situasi serupa.

Di iOS 7, untuk menyembunyikan item tombol bilah, kita dapat menggunakan dua teknik berikut: -

  • gunakan SetTitleTextAttributes: - Ini berfungsi baik pada item tombol bilah seperti "Selesai", "Simpan" dll. Namun, ini tidak berfungsi pada item seperti Tambah, simbol Sampah dll (minimal bukan untuk saya) karena mereka bukan teks.
  • gunakan TintColor: - Jika saya memiliki item tombol bilah yang disebut "deleteButton": -

Untuk menyembunyikan tombol, saya menggunakan kode berikut: -

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

Untuk menunjukkan tombol lagi saya menggunakan kode berikut: -

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
Maks
sumber
[self.navigationItem.rightBarButtonItem setEnabled: NO]; [self.navigationItem.rightBarButtonItem setTintColor: [UIColor clearColor]];
Leon
3
Untuk Swift: deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()untuk menonaktifkan dan menyembunyikan, dan deleteButton.enabled = true; deleteButton.tintColor = niluntuk mengaktifkan kembali dan tampil seperti biasa.
Unixmonkey
1
Saya suka bahwa pendekatan ini memungkinkan saya untuk meletakkan logika apakah akan menampilkan UIBarButton di dalam kelas itu atau tidak. Alasan itu hanya bekerja dengan satu tombol tidak segera jelas - itu karena jika Anda menyembunyikan tombol dengan cara ini masih akan memakan ruang, jadi Anda mungkin memiliki celah kosong jika Anda memiliki beberapa tombol.
SimplGy
Pendekatan pertamamu sempurna untukku. Saya mengatur UIColor.clearuntuk UIControlState.disableddan dapat menampilkan / menyembunyikan tombol dengan setEnabled. Tentu saja seperti yang Anda nyatakan, ini hanya berfungsi untuk tombol teks.
fl034
Jika saya tekan agak lama sampai muncul dalam gambar besar (mungkin untuk aksesibilitas) maka bahkan dengan isEnabled diatur ke false itu masih berfungsi.
Daniel Springer
67

Inilah pendekatan sederhana:

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

Saya hanya menjalankannya di retina iPad saya, dan 0,01 cukup kecil untuk tidak muncul.

Drew Rosenberg
sumber
13
Dari semua solusi, yang ini cepat, kotor, dan efektif. Saya juga menambahkan barbuttItem.enabled = TIDAK; karena saya masih bisa mendapatkan tombol untuk menembak jika saya cukup menekannya.
Stickley
1
Tidak bekerja untuk saya. Saya pikir itu karena saya menggunakan tombol Tambah dengan gambar '+', tetapi saya mencoba tombol Kustom dengan teks "Baru" sebagai gantinya dan itu masih tidak hilang. Pemberdayaan berubah jadi saya tahu kode saya sedang dieksekusi. Ada ide? Perhatikan bahwa tombol ini dibuat dalam storyboard dan memiliki segue jadi saya tidak ingin mengubah ke tombol program saja
Rhubarb
19
Tampaknya tidak berfungsi di bilah alat pengontrol navigasi, tetapi berfungsi untuk bilah alat lainnya.
Drew Rosenberg
3
Itu menyembunyikannya tetapi masih merespon keran. Bagi saya itu bertindak seperti tombol yang tidak terlihat.
Tibidabo
Jika Anda telah menetapkan warna warna global dengan menggunakan baris ini self.window?.tintColor = APP_PRIMARY_COLORdi appdelegate, maka ini tidak akan berfungsi
Mehul Thakkar
60

Dimungkinkan untuk menyembunyikan tombol di tempatnya tanpa mengubah lebarnya atau melepasnya dari bilah. Jika Anda mengatur gaya ke polos, menghapus judul, dan menonaktifkan tombol, itu akan hilang. Untuk mengembalikannya, balikkan perubahan Anda.

-(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;
    }
}
Eli Burke
sumber
2
Ini berhasil bagi saya dengan hanya menetapkan btn.title = nil. Saya juga mengaktifkan pengaturan = TIDAK, untuk berjaga-jaga ...
Pork 'n' Bunny
3
Mengatur tombolItem.title ke nil tidak bekerja untuk saya di iOS7. Tombol tidak muncul kembali ketika mengaturnya kembali. Namun yang berhasil adalah mengatur buttonItem.title = @ "";
Mark Knopper
42

Di bawah ini adalah solusi saya meskipun saya sedang mencari Bar Navigasi.

navBar.topItem.rightBarButtonItem = nil;

Di sini "navBar" adalah IBOutlet ke NavigationBar dalam tampilan di XIB Di sini saya ingin menyembunyikan tombol atau menunjukkannya berdasarkan kondisi tertentu. Jadi saya sedang menguji untuk kondisi di "Jika" dan jika benar saya mengatur tombol untuk nil dalam metode viewDidLoad dari tampilan target.

Ini mungkin tidak relevan dengan masalah Anda dengan tepat tetapi sesuatu yang mirip jika Anda ingin menyembunyikan tombol di NavigationBar

vishal dharankar
sumber
Jika Anda ingin mengatur rightBarButtonItemlagi nanti , pastikan item tombol disimpan dalam IBOutlet yang kuat sehingga tidak dilepaskan ketika Anda melepasnya dari bilah navigasi.
Nate
30

Untuk Swift 3 dan Swift 4 Anda dapat melakukan ini untuk menyembunyikan UIBarButtomItem:

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

Dan untuk menunjukkan UIBarButtonItem:

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

Pada tintColorAnda harus menentukan warna asal yang Anda gunakan untukUIBarButtomItem

pableiros
sumber
2
Tetapi ini masih akan mengambil ruang untuk tombol ini.
Makalele
22

Saat ini saya menjalankan OS X Yosemite Developer Preview 7 dan Xcode 6 beta 6 yang menargetkan iOS 7.1 dan solusi berikut berfungsi dengan baik untuk saya:

  • Buat outlet untuk UINavigationItemdan UIBarButtonItems
  • Jalankan kode berikut untuk menghapus

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • Jalankan kode berikut untuk menambahkan tombol lagi

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];
Olcay Ertaş
sumber
Terima kasih, ini adalah metode terbaik yang saya temukan juga. Pastikan referensi Anda ke tombol Anda kuat.
jyoung
Juga, perlu diingat bahwa ini hanya berfungsi jika Anda hanya memiliki satu tombol di sana. Contohnya akan menghapus semua tombol di sisi itu.
lnafziger
@ joyoung Ini bekerja untuk saya, tetapi mengapa itu penting jika referensi kuat? Saya tidak mencoba cara lain, tetapi biasanya tidak mengaturnya karena itu bukan default.
Robert
@ Robert Anda ingin menggunakan objek di lain waktu, jadi Anda harus memastikan objek tidak mengumpulkan sampah saat Anda mengaturnya menjadi nihil. Jika tidak ada lagi yang mempertahankan objek ketika Anda memberi tahu item tombol bilah tidak masalah untuk menyingkirkannya, jumlah referensi itu adalah 0 dan itu akan menjadi sampah yang dikumpulkan.
jyoung
14

Saya menggunakan IBOutlets dalam proyek saya. Jadi solusi saya adalah:

@IBOutlet weak var addBarButton: UIBarButtonItem!

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

Dan ketika Anda harus menunjukkan bilah ini lagi, cukup atur properti yang dibalik.

Di Swift 3 sebagai gantinya enablegunakan isEnableproperti.

Sarang
sumber
13

self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

Dmitry Semenyuk
sumber
12

iOS 8. UIBarButtonItem dengan gambar khusus. Mencoba berbagai cara, kebanyakan dari mereka tidak membantu. Solusi Max, setTintColoritu tidak berubah menjadi warna apa pun. Saya menemukan yang ini sendiri, berpikir itu akan berguna bagi seseorang.

Untuk Menyembunyikan:

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

Untuk Menunjukkan:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
Rapheal Rinto
sumber
9

Coba di Swift , jangan perbarui tintColorjika Anda memiliki beberapa desain untuk UIBarButtonItem Anda seperti ukuran font di AppDelegate, itu benar-benar akan mengubah tampilan tombol Anda saat muncul.

Dalam hal tombol teks, mengubah judul dapat membiarkan tombol Anda 'menghilang'.

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
Jeffrey Neo
sumber
7

Saya menemukan kerut lain dalam tintColordan isEnabledpendekatan yang disarankan oleh Max dan lain-lain - ketika VoiceOver diaktifkan untuk aksesibilitas dan tombol tersebut secara logis tersembunyi, kursor aksesibilitas masih akan fokus pada tombol bar, dan menyatakan bahwa itu adalah "redup" (yaitu karena isEnabledis set ke false). Pendekatan dalam jawaban yang diterima tidak menderita efek samping ini, tetapi pekerjaan lain di sekitar saya temukan adalah isAccessibilityElementsalah ketika "menyembunyikan" tombol:

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

Dan kemudian mengatur isAccessibilityElementkembali ke true ketika "menunjukkan" tombol:

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

Memiliki item tombol bilah masih memakan ruang bukan masalah dalam kasus saya, karena kami menyembunyikan / menampilkan item tombol bilah kanan paling kiri.

Evan Kirkwood
sumber
6
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

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

Dan sekarang cukup ganti isHiddenproperti.

Bartłomiej Semańczyk
sumber
5

Meningkatkan Dari jawaban @ lnafziger

Simpan Barbuttons Anda di outlet yang kuat dan lakukan ini untuk menyembunyikan / menampilkannya:

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

Kapan pun diperlukan, gunakan Fungsi di bawah ini ..

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
umakanta
sumber
5

Atur barButton.customView = UIView()dan lihat Trick-nya

jeff ayan
sumber
Apa yang dilakukan jawaban ini, adalah memungkinkan semua ukuran fleksibel bekerja. Ini sebenarnya jawaban yang sangat efisien. Mungkin ditambah dengan ekstensi itu akan sempurna.
Adrian_H
4

Tidak ada cara untuk "menyembunyikan" UIBarButtonItem, Anda harus menghapusnya dari superView dan menambahkannya kembali saat Anda ingin menampilkannya lagi.

Kyle Richter
sumber
Ini sebenarnya tidak benar - metode yang dijelaskan oleh Max bekerja dengan baik.
utara
1
nothernman - Max sebenarnya tidak benar. Dia sebenarnya tidak menyembunyikan tombol dengan cara kebanyakan orang akan mendefinisikan "menyembunyikan". Dia hanya membuatnya tidak terlihat dan menonaktifkan interaksi pengguna. Tombolnya masih ada dan membutuhkan ruang. Turun ke bagaimana Anda ingin mendefinisikan "sembunyikan", saya percaya semangat pertanyaan asli ingin benar-benar menghapus / menambahkannya, tidak hanya membuatnya tidak terlihat.
Michael Peterson
4

Ini jauh di bawah daftar jawaban, tetapi untuk berjaga-jaga jika seseorang menginginkan copy dan paste yang mudah untuk solusi cepat, ini dia

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);
    }
}
maninvan
sumber
Tidak buruk tetapi Anda harus memberikan UINavigationItem sebagai parameter dan bukan UIToolbar karena dia meminta untuk menyembunyikan UIBarButtonItem. Saya memodifikasi fungsi Anda menjadi ini: func hideToolbarItem (tombol: UIBarButtonItem, withToolbar toolbar: UINavigationItem) {var toolbarButtons: [UIBarButtonItem] = toolbar.rightBarButtonItems! toolbarButtons.removeAtIndex (toolbarButtons.indexOf (tombol)!) toolbar.setRightBarButtonItems (toolbarButtons, animated: true)} dan itu bekerja dengan baik
Kingalione
3

Salah satu cara untuk melakukannya adalah menggunakan initWithCustomView:(UIView *)properti ketika mengalokasikan UIBarButtonItem. Subclass untuk UIViewakan memiliki properti sembunyikan / tidak terlihat.

Sebagai contoh:

1. Memiliki UIButtonyang ingin Anda sembunyikan / sembunyikan.

2. Jadikan UIButtonsebagai tampilan khusus. Suka :

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

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

3. Anda dapat menyembunyikan / menyembunyikan menyembunyikan yang myButtontelah Anda buat.[myButton setHidden:YES];

iNoob
sumber
Namun, itu tidak akan menutup celah di antara tombol-tombol lain: Ketika "tersembunyi" akan ada area kosong di bilah alat.
lnafziger
@ lnafziger Ya itu benar, tetapi saya tidak membaca OP menyebutkan tentang menutup celah di antara tombol-tombol, tetapi itu adalah hal yang baik untuk dicatat.
iNoob
1
Terima kasih, jawaban Anda juga bermanfaat, tetapi saya pikir sebagian besar orang ketika mereka ingin menyembunyikan tombol pada bilah alat ingin terlihat seperti tidak ada sama sekali (tanpa area kosong). Jika itu kiri atau kanan itu tidak masalah.
lnafziger
Poin bagus, iNoob dan Inafziger - Saya tidak menyebutkannya, tapi ya, saya lebih suka tidak ada tempat kosong.
Sasha
3

Untuk versi Swift, berikut ini kodenya:

Untuk UINavigationBar:

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil
Sohil R. Memon
sumber
2

Mengatur warna teks ke warna yang jelas saat item tombol bilah dinonaktifkan mungkin merupakan opsi yang lebih bersih. Tidak ada keanehan yang harus Anda jelaskan dalam komentar. Anda juga tidak merusak tombol sehingga Anda masih menyimpan segues storyboard terkait.

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

Lalu kapan pun Anda ingin item tombol bilah disembunyikan, Anda bisa melakukannya:

self.navigationItem.rightBarButton.enabled = NO;

Itu tidak ada properti tersembunyi tetapi ini menawarkan hasil yang sama.

anak anjing
sumber
1
Saya memiliki tombol di dalam rightBarButtonItem. Jadi saya mengatur yang diaktifkan untuk TIDAK dan mengubah gambarnya pada keadaan dinonaktifkan ke nol. Bekerja seperti pesona ... Terima kasih
Skywalker
ide yang sangat baik, namun pengaturan gambar ke null tidak bekerja untuk saya, saya harus meletakkan kotak transparan 20x20 sebagai gambar
Lena Bru
2

Jika UIBarButtonItem memiliki gambar alih-alih teks di dalamnya, Anda dapat melakukan ini untuk menyembunyikannya: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

Artem Goryaev
sumber
2

Beberapa metode pembantu yang saya pikir saya akan bagikan berdasarkan jawaban yang diterima lnafziger karena saya memiliki beberapa bilah alat dan beberapa tombol di masing-masing:

-(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];
    }
}
Guy Lowe
sumber
2

Anda dapat dengan mudah mendapatkan tampilan dan menyembunyikannya dengan cara ini

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
Titouan de Bailleul
sumber
2

Jika Anda menggunakan Swift 3

if (ShowCondition){
   self.navigationItem.rightBarButtonItem = self.addAsset_btn 
 } 
else {
   self.navigationItem.rightBarButtonItem = nil
 }
Museer Ahamad Ansari
sumber
2

Berikut ini adalah ekstensi yang akan menangani ini.

extension UIBarButtonItem {

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

}

PEMAKAIAN:

myBarButtonItem.isHidden = true
Harris
sumber
1

Melengkapi respons Eli Burke, jika Anda UIBarButtonItemmemiliki gambar latar belakang alih-alih judul, Anda dapat menggunakan kode:

-(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];
    }
}
Renato Lochetti
sumber
0

Anda perlu memanipulasi array toolbar.items.

Berikut adalah beberapa kode yang saya gunakan untuk menyembunyikan dan menampilkan tombol Selesai. Jika tombol Anda berada di ujung paling atas bilah alat atau di antara tombol-tombol lain, tombol Anda yang lain akan bergerak, jadi jika Anda ingin tombol Anda menghilang begitu saja maka tempatkan tombol Anda sebagai tombol terakhir ke tengah. Saya menghidupkan tombol untuk efek, saya sangat menyukainya.

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

}

jadi sekarang dapat menggunakan kode berikut untuk menunjukkan tombol Anda

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

atau untuk menyembunyikan tombol Anda

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

Di IB jika Anda membiarkan judul tombol kosong, itu tidak akan muncul (tidak pernah diinisialisasi?). Saya sering melakukan ini selama pengembangan selama pembaruan UI jika saya ingin item tombol bilah hilang untuk pembuatan tanpa menghapusnya dan membuang semua referensi outletnya.

Ini tidak memiliki efek yang sama selama runtime, mengatur judul tombol ke nol tidak akan menyebabkan seluruh tombol menghilang. Maaf tidak benar-benar menjawab pertanyaan Anda, tetapi mungkin bermanfaat bagi sebagian orang.

Sunting: Trik ini hanya berfungsi jika gaya tombol diatur ke polos

pretzels1337
sumber
0

Saya akan menambahkan solusi saya di sini karena saya belum menemukannya disebutkan di sini. Saya memiliki tombol dinamis yang gambarnya tergantung pada status satu kontrol. Solusi paling sederhana bagi saya adalah mengatur gambar niljika kontrol tidak ada. Gambar diperbarui setiap kali kontrol diperbarui dan karenanya, ini optimal untuk saya. Hanya untuk memastikan saya juga mengatur enableduntuk NO.

Mengatur lebar ke nilai minimal tidak berfungsi di iOS 7.

mkko
sumber
0

Dengan kredit ke @lnafziger, @MindSpiker, @vishal, et. Al,

Satu liner paling sederhana yang saya datangi untuk satu tombol bar kanan (atau kiri) adalah:

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

Seperti dalam:

@interface MyClass()

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

@end

@implementation

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

@end

Saya menguji ini dan itu bekerja untuk saya (dengan item tombol bar yang kuat ditransfer melalui IB).

Chris Conover
sumber
Ini akan berfungsi jika Anda hanya memiliki satu tombol, tetapi jika Anda memiliki beberapa tombol, Anda harus menggunakan metode yang lebih sesuai dengan jawaban saya.
lnafziger