在iPhone上切换UIButton

问题描述:

如何制作一个显示“显示图片”的按钮,当它被点击时,它会变为“隐藏图片”。我是新来的目标C,我知道如何在界面生成器中制作按钮,但不知道如何切换按钮的文本和功能。有人可以帮我吗?在iPhone上切换UIButton

滥用按钮的.tag属性。挂钩触摸下压动作给这个函数:

-(IBAction)buttonClick:(UIButton*)sender 
{ 
    if (sender.tag) 
    { 
     sender.tag = 0; 
     sender.text = @"Show Picture"; 
     // do actions when "hide" is clicked 
    } else { 
     sender.tag = 1; 
     sender.text = @"Hide Picture"; 
     // do actions when "show" is clicked 
    } 
} 
+0

谢谢。这是什么?标签属性呢? – Fasid 2010-08-06 23:44:55

+2

通常情况下,您会以相反的方式使用它:这是一种在IB中“标记”按钮(或其他项)的简单方法,因此您只能有一个处理程序接收事件,从标记中可以看到该操作来自哪个按钮。 (你仍然可以混合这两个东西,例如通过标记按钮0,2,4,...并使用'sender.tag^= 1;'翻转最后一位,并使用'sender.tag&1'进行测试,但我故意保持例子非常简单,所以你看到发生了什么。 – mvds 2010-08-06 23:51:38

+0

我明白了。谢谢... – Fasid 2010-08-07 00:08:08

而不是使用标签属性(AB),你也可以简单地切换的按钮来选择,而不是选择,就像这样:

- (IBAction)myButtonAction:(id)sender 
{ 
    [sender setSelected:![sender isSelected]]; 

    // or in Objective-C 2.0 if you're so inclined 
    sender.selected = !sender.selected; 
} 

在IB中,您可以直接在检查器中(或以编程方式通过setTitle:forState:方法)设置正常和按钮的选定状态的文本。

与这一个棘手的事情是,一个UIButton没有“正式”的文本正确 - 在这里看到的文档:

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIButton_Class/UIButton/UIButton.html

,因为它的设计有文本的多个独立的套,根据按钮的当前状态显示;即当前是启用还是禁用,突出显示等等。所以没有一个简单的属性可以设置使其工作。

所以,你要声明你这样的按钮,因为这两个动作和出口:

从button.h:

// inside the class declaration 

BOOL pictureShown ; // initializer not required, defaults to 0 (NO) 

UIButton * sampleButton ; 

// skip irrelevant lines here 

@property (nonatomic, retain) IBOutlet UIButton * sampleButton ; 
- (IBAction) doSampleButton ; 

胡克都在Interface Builder那些起来的,然后使用setTitle:forState:方法更改文本(在这种情况下,我已指定所有状态,因此标题在所有状态中保持不变)。例如:

从button.m:

@synthesize sampleButton ; 

- (IBAction) doSampleButton { 
    if (pictureShown == YES) { 
     // hide the picture, and then... 

     [sampleButton setTitle: @"Show Picture" forState: (UIControlStateNormal | UIControlStateHighlighted | UIControlStateSelected | UIControlStateDisabled)] ; 
     pictureShown = NO ; 
    } else { 
     // show the picture, and then... 

     [sampleButton setTitle: @"Hide Picture" forState: (UIControlStateNormal | UIControlStateHighlighted | UIControlStateSelected | UIControlStateDisabled)] ; 
     pictureShown = YES ; 
    } 
} 

您还会注意到我已经声明一个实例变量,“pictureShown”,在与按钮视图的视图控制器,跟踪当前按钮的“模式”,并且我基本上在按钮的动作中使用if语句来确定根据按钮的当前模式执行哪个功能,并相应地切换按钮文本。 (我正在使用它来跟踪按钮的当前模式,而不是直接检查当前按钮的标题或按钮上存储状态的其他方式,因为MVC明智的,这种类型。的状态中,控制器类所属)

(如果函数需要大量的代码,我会使用消息来自,即:

[self showPicture] ; 
[self hidePicture] ; 

以避免必须填满它所有内部doSampleButton,但这是纯粹的风格,而不是技术上的要求。

请勿滥用标签属性。建议只用作按钮标识符(例如,当您的视图中有几个按钮将标签设置为0,1,2 ......因此可以识别哪个按钮是发件人时)。你可以设置一些全局变量,并相应地改变它的值。