如何动态隐藏视图中的按钮?

时间:2008-11-10 01:45:17

标签: iphone cocoa-touch

我想根据某种情况在我的一个视图中动态隐藏按钮。

我尝试在视图控制器的-viewWillAppear方法中添加一些代码,在显示实际视图之前隐藏按钮,但我仍然不知道该怎么做。

我通过IBOutlet引用了按钮,但我不确定如何从这里继续前进。作为参考,这是一个UIBarButtonItem实例。

12 个答案:

答案 0 :(得分:54)

如果您试图隐藏UIBarButtonItem,您实际上必须修改父栏的内容。如果它是一个UIToolBar,你需要将bar的items数组设置为一个不包含你的项目的数组。

NSMutableArray     *items = [[myToolbar.items mutableCopy] autorelease];
[items removeObject: myButton];
myToolbar.items = items;

答案 1 :(得分:20)

将条形项设置为nil。

例如:

self.navigationItem.leftBarButtonItem = nil;

答案 2 :(得分:11)

所以我尝试了Ben的获胜方法,但最终我发现这对我的目的是错误的 - 虽然我确定这取决于你想要做什么。我试图仅在某些条件下显示导航栏按钮,然后在条件不再满足时立即隐藏它(在我的情况下,它是用于隐藏与UITextView关联的键盘的“完成”按钮。它应该只是当用户在文本视图中键入时显示)。我的步骤如下:

  1. 我添加了一个UIBarButtonItem作为 我的UIViewController中的属性 类。我在实例中实例化它 initWithNibName方法。

  2. 我将UIBarButtonItem属性指定为 右栏中的barButtonItem为 用户开始输入后立即 文本视图。

  3. 我设置了UIBarButtonItem属性 当用户完成输入时为零。

  4. 它的工作就像一个魅力。我在下面添加了一些代码示例。

    首先在我的视图控制器init方法中实例化按钮:

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

    然后我将其设置为委托方法中的右侧栏按钮,一旦用户开始编辑文本视图,就会调用该按钮:

    self.navigationItem.rightBarButtonItem=[self barButtonItemDone];
    

    最后,当单击按钮本身时,会调用一个名为“done”的方法,我只是在该方法中将rightBarButtonItem设置为nil:

    self.navigationItem.rightBarButtonItem=nil;
    

答案 3 :(得分:10)

如果所有人都试图隐藏的是导航栏中的后退按钮,则有一种更简单的方法:

self.navigationItem.hidesBackButton = YES;

引用开发者文档:

  

hidesBackButton

     

一个布尔值,用于确定后退按钮是否隐藏。

     

@property(nonatomic,assign)BOOL hidesBackButton

     

讨论

     

如果此导航项位于顶部时隐藏了后退按钮,则为“是”   项目;否则,不。默认值   是的。

     

状况

     

适用于iPhone OS 2.0及更高版本。

答案 4 :(得分:7)

这有点像黑客,但它适用于我的情况(它正确处理动态间距):

隐藏:

myButton.width = 0.1;

显示:

myButton.width = 0.0;

0.0的宽度是“自动宽度”,宽度为0.1时,按钮完全消失(甚至不是按钮的“条子”,但我没有在视网膜显示器上试过这个。)

答案 5 :(得分:5)

另一个hacky解决方案:

myButton.customView = [[UIView alloc] init];

答案 6 :(得分:2)

对此最好的解决方案是技术性较差。您需要做的就是创建常规导航栏(顶部)或工具栏(底部),但不使用可选按钮。然后创建另一个相同但更短的条,然后将其放置在您想要可选按钮的部分,并在第二个较短的条上创建可选按钮。

现在,您可以在整个附加栏上拨打hidden = YES

酒吧与我无缝重叠,您的里程可能会有所不同。

答案 7 :(得分:2)

这个答案是关于基于文本的UIBarButtonItems,但是,同样的概念也可以应用于其他类型的按钮。请注意,这将允许隐藏再次显示该项目。上面的许多答案(例如,将按钮的值设置为nil,如果需要,则不允许重新显示按钮)。

TL; DR:

if (shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = nil;
    self.myBarButtonItem.action = nil;
} else if (!shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = @"Title";
    self.myBarButtonItem.action = @selector(mySelector:);
}

长版:

我试图隐藏的UIBarButtonItem位于UIToolbar中,而不是UINavigationBar,因此访问导航项左侧(或右侧)barButtonItem属性的所有建议都不适用于我。另外,如上所述,我希望在情况发生变化时重新显示按钮。

迈克尔的建议最接近于工作,但至少在iOS 7上,仍然显示了一个非常的显示按钮的小条子。在我的应用程序中,当它不应该可用时点击该项目是不可接受的。上面的代码隐藏了按钮,并且关键地停用了按钮。

我在私有刷新方法中调用上述代码,该方法在用户事件发生时调用。

答案 8 :(得分:1)

这就是我对不属于导航栏的按钮项所做的(其中Blank.png是我创建的空白图像,它与它所替换的图像大小相同):

theButton.enabled = NO;
theButton.image = [UIImage imageNamed: @"Blank.png"];

答案 9 :(得分:1)

Ben的回答在技术上是正确的,但是当我在我的自定义UIToolbar上尝试时,这些项目以我不喜欢的方式展开,因为我使用的是UIBarButtonSystemItemFlexibleSpace项目。

如果您希望其他物品停留在同一个地方,您必须将灵活空间设置为固定空间,或尝试我所做的事情:

[filterBarButton.customView setHidden:YES];

注意:这仅在您的UIBarButtonItem使用自定义视图时才有效。

答案 10 :(得分:1)

如果您向UIButton添加UIBarButtonItem而不是仅使用UIBarButtonItem

然后,您可以将UIButton.hidden分配给TRUEYES,并且它(以及UIBarButtonItem)将不会显示或处于活动状态。

希望有所帮助。

答案 11 :(得分:-13)

只需将按钮的隐藏属性设置为true:

myButton.hidden = YES;
相关问题