我正在尝试创建一个应用程序,其中一个功能是能够同时计时多个事物。我在视图上有两个UILabel和两个UIButtons,并且有代码可以在按下相应按钮时使一个标签开始计时。从我的代码中可以看出,我有两件事:
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *display;
- (IBAction)startPressed:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *display2;
- (IBAction)startPressed2:(id)sender;
@end
@implementation ViewController {
bool start;
bool start2;
NSTimeInterval time;
NSTimeInterval time2;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.display.text = @"0:00";
self.display2.text = @"0:00";
start = false;
start2 = false;
}
-(void) update1 {
if (start == false) {
return;
}
NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];
NSTimeInterval elapsedTime = currentTime - time;
int minutes = (int)(elapsedTime / 60.0);
int seconds = (int)(elapsedTime = elapsedTime - (minutes * 60));
self.display.text = [NSString stringWithFormat:@"%u:%02u", minutes, seconds];
[self performSelector:@selector(update1) withObject:self afterDelay:0.1];
}
-(void) update2 {
if (start2 == false) {
return;
}
NSTimeInterval currentTime2 = [NSDate timeIntervalSinceReferenceDate];
NSTimeInterval elapsedTime2 = currentTime2 - time2;
int minutes2 = (int)(elapsedTime2 / 60.0);
int seconds2 = (int)(elapsedTime2 = elapsedTime2 - (minutes2 * 60));
self.display2.text = [NSString stringWithFormat:@"%u:%02u", minutes2, seconds2];
[self performSelector:@selector(update2) withObject:self afterDelay:0.1];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)startPressed:(id)sender {
if (start == false) {
start = true;
time = [NSDate timeIntervalSinceReferenceDate];
[sender setTitle:@"Stop" forState:UIControlStateNormal];
[self update1];
}else {
start = false;
[sender setTitle:@"Start" forState:UIControlStateNormal];
}
}
- (IBAction)startPressed2:(id)sender {
if (start2 == false) {
start2 = true;
time2 = [NSDate timeIntervalSinceReferenceDate];
[sender setTitle:@"Stop" forState:UIControlStateNormal];
[self update2];
}else {
start2 = false;
[sender setTitle:@"Start" forState:UIControlStateNormal];
}
}
@end
但是,当我运行应用程序时,无论我按哪个按钮,第一个Label都会开始计数。请帮忙,我不能让两个计时器同时运行。
谢谢!
答案 0 :(得分:2)
注意:问答代码已经大幅更新,因为这个答案是第一次写的。
update
和update2
都调用相同的方法:
[self performSelector:@selector(update) withObject:self afterDelay:0.1];
update2
应致电:
[self performSelector:@selector(update2) withObject:self afterDelay:0.1];
避免这类错误的最佳方法是通过良好的命名,update1
和update2
会避免此错误。此外,还有相当多的代码可以考虑到常见的menthols中,以确保通过一次代码更改来实现两个定时器共同的未来更改。
Objective-C使用BOOL
YES
和NO
作为布尔常量而非bool
使用true
和false
。它通常可以更容易地使用系统的约定。
命名非常重要,因为它消除了重复的代码。这是一个演示实现:
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *display1;
@property (weak, nonatomic) IBOutlet UILabel *display2;
@property (nonatomic) NSTimeInterval time1;
@property (nonatomic) NSTimeInterval time2;
@property (nonatomic, getter = isRunning1) BOOL running1;
@property (nonatomic, getter = isRunning2) BOOL running2;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.display1.text = [self elapsedTimeInterval:0];
self.display2.text = [self elapsedTimeInterval:0];
self.running1 = NO;
self.running2 = NO;
}
-(void) update {
if (self.isRunning1) {
self.display1.text = [self elapsedTimeInterval:self.time1];
}
if (self.isRunning2) {
self.display2.text = [self elapsedTimeInterval:self.time2];
}
if (self.isRunning1 || self.isRunning2) {
[self performSelector:@selector(update) withObject:self afterDelay:0.1];
}
}
- (NSString *)elapsedTimeInterval:(NSTimeInterval)timeInterval {
NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];
if (timeInterval == 0) {
timeInterval = currentTime;
}
int elapsedTime = currentTime - timeInterval;
int minutes = elapsedTime / 60;
int seconds = elapsedTime % 60;
NSString *displayText = [NSString stringWithFormat:@"%u:%02u", minutes, seconds];
return displayText;
}
- (IBAction)startPressed1:(UIButton *)button {
self.running1 = !self.isRunning1;
if (self.running1 == YES) {
self.time1 = [NSDate timeIntervalSinceReferenceDate];
[self update];
}
[self setTitleOfButton:button state:self.isRunning1];
}
- (IBAction)startPressed2:(UIButton *)button {
self.running2 = !self.isRunning2;
if (self.running2 == YES) {
self.time2 = [NSDate timeIntervalSinceReferenceDate];
[self update];
}
[self setTitleOfButton:button state:self.isRunning2];
}
- (void)setTitleOfButton:(UIButton *)button state:(BOOL)state {
NSString *title = state ? @"Start" : @"Stop";
[button setTitle:title forState:UIControlStateNormal];
}
@end
请注意,此代码中有许多不良做法,我故意没有解决这些问题。
答案 1 :(得分:0)
检查你的xib文件,更具体地说,检查display1和display2的连接是否正确。
复制/粘贴标签时,您可能错误地连接了标签。