使用条件语句以编程方式切换 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 文本的主要内容,如果未能解决你的问题,请参考以下文章