有没有办法在倒数计时器中使用UIButton文本?

时间:2015-05-27 04:08:17

标签: ios objective-c timer uibutton uilabel

我是iOS开发的新手,我正在编写一个具有倒数计时器的应用。我希望用户能够点击设置它的时间,所以我使用UIButton,因为这似乎是最简单的事情。我在本网站上看到过关于使用' UILabel'对于计时器和使用轻击手势来检测用户触摸“UILabel”,但似乎大多数人建议使用UIButton

我遇到的问题是我将UIButton文本初始化为00:00,然后在用户选择时间时将其更改。定时器设置为每隔0.25秒(重复)关闭,并且处理程序每​​次检测到时间已经改变了至少1秒时更新按钮中的文本。

我遇到的问题是,在UIButton文本的更新之间,UIButton文本将恢复为00:00。例如,如果计时器设置为10分钟(10:00),则UIButton文本执行此操作: 10:00(开始时)

<00> 00:00(约0.5秒)

09:59(1秒后)

<00> 00:00(约1.5秒后)

如果我使用UILabel,则不会发生这种情况。以这种方式使用UIButton有什么本质上的错误吗?我应该只使用UILabel并弄清楚如何进行点按手势吗?任何帮助将不胜感激!

以下是我更新UIButton文字的代码(我使用通知事件):

- (void)timerChangedNotification:(NSNotification *)notification
{
    Timer *timer = (Timer *) notification.object;

    if ([[notification name] isEqualToString:@kGameClockTimer]) {
        NSInteger timeInMinutes = (timer.currentTimeInSeconds / 60) % 60;
        NSInteger timeInSeconds = timer.currentTimeInSeconds % 60;

        if ((self.lastTimeInMinutes != timeInMinutes) || (self.lastTimeInSeconds != timeInSeconds)) {
            self.lastTimeInMinutes = timeInMinutes;
            self.lastTimeInSeconds = timeInSeconds;
            // this label is to see if the same behavior happens using a label
            self.timerLabel.text = [NSString stringWithFormat:@"%02ld:%02ld",
                                            (long)timeInMinutes, timeInSeconds];
            self.timerButton.titleLabel.text = [NSString stringWithFormat:@"%02ld:%02ld",
                                (long)timeInMinutes, timeInSeconds];
        }
    }
}

修改 基于下面的一些评论,我在设置&#39; UIButton&#39;时更改了代码。是这样的:

[self.timerButton setTitle:[NSString stringWithFormat:@"%02ld:%02ld", (long) timeInMinutes, (long) timeInSeconds] forState:UIControlStateNormal];

这让我更接近,因为我在更新之间没有得到00:00,但是文字仍然是&#34;闪烁&#34;更新之间。我怀疑它与forState有关。我是否还需要为其他州设置标题?

修改 好的,我通过按钮&#34;闪烁&#34;找到了我的问题的解决方案。我不得不补充: 我的代码中[UIView setAnimationsEnabled:NO];

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您想使用按钮来显示倒计时吗?

我认为您可以使用以下方式。我试过了,它对我有用。

我有三个属性

@property(nonatomic,assign)NSInteger time;
@property (weak, nonatomic) IBOutlet UIButton *smsButton;
@property(nonatomic,strong)NSTimer *timer;

然后使用方法启动计时器:

- (void)smsButtonPressed :(id)sender {

self.time = 60;
self.smsButton.enabled = NO;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

}

在updateTime方法中,执行以下操作:

- (void)updateTime {

if (self.time == 0) {

    [self resetTimer];
}
[self.smsButton setTitle:[NSString stringWithFormat:@"%ld",self.time] forState:UIControlStateDisabled];
self.time --;

}

使用上述方法,我认为您可以实现您想要实现的目标。

愿这有帮助。 :)

答案 1 :(得分:1)

我设置了这样的按钮标题,并且无需还原即可正常工作。也许,你在代码中意外地将其还原了?

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button addTarget:self
           action:@selector(action:)
 forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(0, 0, 220,40);

[button setTitle:@"string" forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
button.backgroundColor = [UIColor clearColor];
button.titleLabel.attributedText = [[NSAttributedString alloc] initWithString:@"string"     
attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor], NSFontAttributeName:[UIFont fontWithName:@"Helvetica Neue" size:21.0f]}];

答案 2 :(得分:1)

你应该没问题使用UIButton。但我认为你正在做这个

button.titleLabel.text = @"09:59";

而不是

[button setTitle:@"09:59" forState:UIControlStateNormal];