【问题标题】:toggle UIButton text programmatically with a conditional statement使用条件语句以编程方式切换 UIButton 文本
【发布时间】: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——所以我很确定我的连接没有问题。

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

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案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 :)
        猜你喜欢
        • 2011-11-06
        • 2017-09-05
        • 1970-01-01
        • 2015-05-09
        • 2011-05-04
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多