2014-02-10 27 views
-1

我正在嘗試創建一個應用程序,其中一個功能是同時處理多個事件的功能。我在視圖上有兩個UILabels和兩個UIButton,並且有代碼可以在按下相應的按鈕時使一個標籤開始計時。正如你可以從我的代碼中看到的,我有兩個的一切:無法創建兩個秒錶

#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 

然而,當我運行應用程序,無論我按哪個按鈕,第一個標籤開始計數。請幫忙,我不能讓兩個計時器同時運行。

謝謝!

+0

'display'和'display2'被連接到相同的標籤。 –

+0

能否詳細說明一下?我不完全明白你的意思。 – stevethedude

+0

在某些方法的開始處使用斷點或NSLog來查看在按下按鈕時會調用哪些斷點或NSLog。 –

回答

0

檢查您的xib文件,更具體地說,檢查display1和display2的連接是否正確。

當複製/粘貼標籤時,您可能錯誤地連接了標籤。

+0

@stevethedude仍然沒有重新命名'startPressed'和'display',所以,確實有一個很好的改變,即連接不正確。 – zaph

+1

這個修復了,謝謝。原來,我的連接畢竟有問題。感謝所有幫助過的人! – stevethedude

2

注:自該答案第一次寫入以來,問題代碼已大幅更新。

兩個updateupdate2調用相同的方法:

[self performSelector:@selector(update) withObject:self afterDelay:0.1]; 

update2應該叫:

[self performSelector:@selector(update2) withObject:self afterDelay:0.1]; 

,以避免這樣的錯誤,最好的辦法是通過良好的命名,update1update2往往會避免這個錯誤。此外,還有相當多的代碼可以被考慮到常見的薄荷醇中,以確保未來的變化對於兩個定時器都是通用的,只需要一次代碼更改。

Objective-C的使用BOOLYESNO作爲布爾常量不booltruefalse。它通常可以更容易地使用系統的約定。

命名和消除重複代碼一樣重要。這裏是一個演示實現:

#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 

請注意,這個代碼有很多不好的做法,我故意沒有解決。

+0

感謝您的迴應,但是一旦我做出更改,兩個定時器就會在按下startPressed2按鈕的同時開始運行。我用現在的代碼編輯了OP。 – stevethedude

+0

仍然沒有重新命名是'startPressed'和'display',所以連接不正確是一個很好的改變。否則,當前的代碼是正確的。 – zaph