使用条件语句以编程方式切换 UIButton 文本

Posted

技术标签:

【中文标题】使用条件语句以编程方式切换 UIButton 文本【英文标题】:toggle UIButton text programmatically with a conditional statement 【发布时间】:2012-04-23 17:26:36 【问题描述】:

这是我的代码(它包含在按下按钮时调用的 IBAction 中):

if (myButton.currentTitle == @"test") 

    [myButton setTitle:@"test2" forState:UIControlStateNormal];


if (myButton.currentTitle == @"test2") 

    [myButton setTitle:@"test" forState:UIControlStateNormal];

我希望 UIButton 文本在按下时切换(如果 text = "test" 然后更改为 "test2",按下时如果 text = "test2" 更改为 "test")。

我确实有一个连接到 myButton 的 IBOutlet 和连接到 myButton 的 IBAction——所以我很确定我的连接没有问题。

由于某种原因这不起作用,我确定我遗漏了一些非常简单的东西。

【问题讨论】:

【参考方案1】:

使用 isEqualToString: 代替 ==

【讨论】:

这很好用。谢谢(不得不删除评论并等待 9 分钟后接受?很奇怪。)【参考方案2】:

这是因为您缺少一个控制语句,当第一个成功时跳过第二个if。当你进入带有"test"的块时,你将它切换为"test2",然后第二个条件立即成功,你将"test2"转回"@test"

您可以使用 else 来解决此问题,但您可以使用将当前状态映射到新状态的 NSArray 完全跳过 if

// This should be made static, and initialized only once
NSDictionary *nextTitle = [NSDictionary dictionaryWithObjectsAndKeys:
    @"test", @"test2", @"test2", @"test", nil];

// This line does the toggling
[myButton setTitle:[nextTitle valueForKey:myButton.currentTitle] forState:UIControlStateNormal];

【讨论】:

我认为这不是问题。 @RIP 一旦 OP 找出了isEqualToString,他会立即找到缺少的else 问题:) 我希望你能接受两个答案。我确实忘记了“其他”,并在之后立即遇到了这个问题。感谢您的帮助。【参考方案3】:
if ([myButton.currentTitle isEqualToString:@"test"]) 

  [myButton setTitle:@"test2" forState:UIControlStateNormal];
 

if ([myButton.currentTitle isEqualToString:@"test2"]) 

   [myButton setTitle:@"test" forState:UIControlStateNormal];

希望对你有帮助……

【讨论】:

【参考方案4】:

比较用户可见的字符串通常被认为是不好的做法(当您需要执行 i18n 时会变得乏味),尤其是字符串文字,因为它容易出现拼写错误。

如果您只是要在两个状态之间切换,最简单的方法是使用UIControl.selected 属性(对应于UIControlStateSelected):

// In init
[myButton setTitle:@"test" forState:UIControlStateNormal];
[myButton setTitle:@"test2" forState:UIControlStateSelected];
[myButton setTitle:@"test2" forState:UIControlStateSelected|UIControlStateHighlighted];

// Toggle
myButton.selected = !myButton.selected;

当您决定切换按钮图像/背景/文本颜色时,它也会使代码更清晰。

注意一个小问题:如果您没有为UIControlStateSelected|UIControlStateHighlighted 设置标题,当按钮被选中并突出显示(触摸)时,它将使用UIControlStateNormal 的标题。

【讨论】:

【参考方案5】:

在比较字符串时尝试使用if([str1 compare:str2] == NSOrderedSame)

【讨论】:

我倾向于避免使用-compare:,因为很容易意外地使用if ([a compare:b])。另外,我尽量避免将其与NSOrdered* 进行比较,以防某些代码返回 2 而不是 NSOrderedDescending(NSComparisonResult 的类型定义为 NSInteger,因此这可能是有效的,并且没有协议另有说明)。 好吧,因为正如你提到的那样,在我的解决方案中 NSOrderSame 是安全的,并且由于我的解决方案没有 if([a compare:b]) 的情况,我认为它不值得 -1 但它是重要的是在它下面添加你有价值的 cmets 作为 cmets :)

以上是关于使用条件语句以编程方式切换 UIButton 文本的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式设置 UIButton 文本颜色 [重复]

在 Swift 中以编程方式更改 UIButton 的文本(填充)

根据条件以编程方式拉伸 UIButton 宽度

以编程方式快速更改 UIButton 的文本

以编程方式在UIButton上设置图像和文本

如何在 Swift 中以编程方式调整 UIButton 中文本的字体大小以适应宽度?