How can I dynamically hide a button from a view?

前端 未结 12 2103
执念已碎
执念已碎 2020-12-04 21:24

I would like to dynamically hide a button in one of my views depending on a certain condition.

I tried adding some code to the view controller\'s -viewWillAppe

相关标签:
12条回答
  • 2020-12-04 22:19

    If you're trying to hide a UIBarButtonItem, you'll actually have to modify the contents of the parent bar. If it's a UIToolBar, you'll need to set the bar's items array to an array that doesn't include your item.

    NSMutableArray     *items = [[myToolbar.items mutableCopy] autorelease];
    [items removeObject: myButton];
    myToolbar.items = items;
    
    0 讨论(0)
  • 2020-12-04 22:21

    The best solution to this is less technical. All you need to do is create your normal navigation bar (top) or toolbar (bottom), but without the optional button. Then create another identical, but shorter bar which you then place at the part you want the optional button and create your optional button on this second shorter bar.

    Now you can call hidden = YES on the whole additional bar.

    The bars seamlessly overlap for me, your mileage may vary.

    0 讨论(0)
  • 2020-12-04 22:24

    Another hacky solution:

    myButton.customView = [[UIView alloc] init];
    
    0 讨论(0)
  • 2020-12-04 22:27

    So I tried Ben's winning approach but in the end I found it to be wrong for my purposes - though I'm sure it depends upon what you're trying to do. I was trying to show a nav bar button under certain conditions only and then hide it as soon as the condition was no longer met (in my case it's a "Done" button used to hide the keyboard associated with a UITextView. It should only be displayed when the user is typing in the text view). My steps were as follows:

    1. I added a UIBarButtonItem as a property in my UIViewController class. I instantiate it in the initWithNibName method.

    2. I assigned the UIBarButtonItem property as the rightBarButtonItem in the nav bar as soon as the user starts typing in the text view.

    3. I set the UIBarButtonItem property to nil when the user is done typing.

    It's working like a charm. I'm adding some code samples below.

    First to instantiate the button in my view controller init method:

    barButtonItemDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
    

    Then I set it as the right bar button in the delegate method that is called as soon as the user starts to edit the text view:

    self.navigationItem.rightBarButtonItem=[self barButtonItemDone];
    

    Finally, when the button itself is clicked, a method called "done" is called and I just set the rightBarButtonItem to nil inside that method:

    self.navigationItem.rightBarButtonItem=nil;
    
    0 讨论(0)
  • 2020-12-04 22:27

    Ben's answer is technically correct, though when I try it on my custom UIToolbar, the items space out in a way that I don't like, because I use UIBarButtonSystemItemFlexibleSpace items.

    If you want your other items to stay in the same place, you'll either have to set your flexible spaces to fixed spaces, or try what I did:

    [filterBarButton.customView setHidden:YES];
    

    note: this only works if your UIBarButtonItem uses custom views.

    0 讨论(0)
  • 2020-12-04 22:30

    Set the bar item to nil.

    For example:

    self.navigationItem.leftBarButtonItem = nil;
    
    0 讨论(0)
提交回复
热议问题