2012-07-06 37 views
0

這可能是一個簡單的問題,但我是一個新手,所以我畫了一個空白。觸發日期更改時重新顯示

我有一個2D圖形應用程序,其圖形(在drawRect中實現)取決於日期。當日期發生變化時,圖形會發生變化,所以我需要撥打我的號碼

[myView setNeedsDisplay: YES]; 

當日期發生變化時。我看過定時器的代碼,但這似乎並不是定時器類型的場景。我將如何檢查本地日期是否發生變化,以及我將該代碼放在哪個類中?我認爲它會出現在我的主視圖的.m文件中。除了在更改日期時自動觸發,最終,應用程序將需要在用戶輸入時觸發(可能是一天前後按鈕或在日期選擇器選擇時)。

圖形呈現就好,但我沒有編碼任何日期觸發器,所以雖然drawRect代碼是特定於日期的,但它在日期更改時不會更改。

P.S.上面的基本問題已經得到解答,但現在我開始實施它,我意識到我還有一個問題。我應該有一個屬性來跟蹤當前正在顯示其配置的日期。顯而易見的想法是將一個屬性添加到包含NSDate對象的主視圖中。但是我對事物編碼的方式,計算是通過子視圖類中的方法完成的。所以問題是,如何從子視圖更新主視圖的NSDate屬性。另一種方法是將NSDate屬性添加到子視圖中,但有多個這樣的子視圖,這似乎是多餘的。對此有何看法?

+0

我還沒有嘗試過任何東西。在嘗試某些事情之前,我需要先想出一個想法,出於某種原因,我正在畫一個空白。我會研究NSDate和相關的項目。謝謝。 – 2012-07-06 20:16:12

+0

此外,您應該更具體地瞭解您想要的日期更改類型 - 日,年,月,分,秒? NSDate將註冊所有這些更改,並由您來決定所需的更改。 – Dustin 2012-07-06 20:20:54

+0

達斯汀,如果日期變化的類型不同,它是否真的改變了答案?無論如何,沒有更多細節,日期只是一天的名字。日期每天都在變化。我希望參加的活動是每日活動。一般來說,它不需要。默認情況可能會在當地午夜時觸發,但同樣不一定。例如,爲了測試,我可能會使用分鐘觸發器。 – 2012-07-06 21:14:25

回答

2

爲此,您可以使用NSTimer。首先,您需要確定NSTimer何時應該啓動。您可以使用NSDateNSCalendarNSDateComponents爲:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *todayComponents = [calendar components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; 
NSDate *today = [calendar dateFromComponents:todayComponents]; 
// today is the start of today in the local time zone. Note that `NSLog` 
// will print it in UTC, so it will only print as midnight if your local 
// time zone is UTC. 

NSDateComponents *oneDay = [[NSDateComponents alloc] init]; 
oneDay.day = 1; 
NSDate *tomorrow = [calendar dateByAddingComponents:oneDay toDate:today options:0]; 

一旦你有tomorrow,你可以設置一個計時器火在該日期:

NSTimer *timer = [[NSTimer alloc] initWithFireDate:tomorrow interval:0 target:self selector:@selector(tomorrowTimerDidFire:) userInfo:nil repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
// The run loop retains timer, so you don't need to. 

而且在tomorrowTimerDidFire:

- (void)tomorrowTimerDidFire:(NSTimer *)timer { 
    [myView setNeedsDisplay:YES]; 
} 
+0

非常感謝您的回覆。 – 2012-07-06 21:16:39

+0

我忘了提及你可能想在'tomorrowTimerDidFire:'中創建另一個計時器,因爲當'tomorrowTimerDidFire:'運行時,明天是今天的明天,你需要在明天再次調用它。 – 2012-07-06 21:18:03

+0

謝謝,羅布。這就是我所設想的,但提到它是個好主意。這引出了另一個問題。在我對定時器的閱讀中,我看到提到在完成時殺死定時器。謹慎評論? – 2012-07-06 21:44:28

相關問題