2012-07-06 2 views
0

이것은 아마도 쉬운 질문 일 수 있습니다. 그러나 저는 초보자입니다. 그래서 비어 있습니다.날짜 변경시 다시 표시 트리거

그래픽 (drawRect로 구현 됨)이 날짜에 의존하는 2D 그래픽 응용 프로그램이 있습니다. 날짜가 바뀌면 그래픽이 바뀌므로

[myView setNeedsDisplay: YES]; 

날짜가 변경되면 전화를 걸게됩니다. 타이머에 대한 코드를 본 적이 있지만 이는 타이머 유형의 시나리오처럼 보이지 않습니다. 현지 날짜가 변경되었는지 그리고 어떤 코드를 입력해야하는지 어떻게 확인할 수 있습니까? 내 주요보기 .m 파일에 갈 것이라고 가정합니다.

날짜 변경시 자동으로 트리거되는 것 외에도 결국 앱은 사용자 입력시 트리거해야합니다 (버튼을 하루 또는 뒤로 선택하거나 날짜 선택기 선택시).

그래픽은 그대로 렌더링되지만 날짜 트리거는 코딩하지 않았으므로 drawRect 코드는 특정 날짜이지만 draw 된 날짜가 변경되면 변경되지 않습니다.

P. 위의 기본적인 질문에 답을 얻었으나 이제 구현하기 위해 다른 문제가 있음을 알았습니다. 나는 현재 구성이 표시된 날짜를 추적 할 수있는 어딘가에 재산을 가지고 있어야합니다. 분명한 생각은 NSDate 객체를 포함하는 기본보기에 속성을 추가하는 것입니다. 하지만 내가 코딩 한 것처럼, 계산은 하위 뷰 클래스의 메서드에 의해 수행됩니다. 그래서 질문은 어떻게 하위 뷰에서 기본보기의 NSDate 속성을 업데이 트하는 것입니다. 대안은 NSDate 속성을 하위 뷰에 추가하는 것이지만, 여러 개의 하위 뷰가 있으며 중복되는 것처럼 보일 수 있습니다. 이것에 대한 의견?

+0

아무 것도 시도하지 않았습니다. 뭔가를 시도하기 전에 아이디어가 필요합니다. 그리고 어떤 이유인지 나는 비어 있습니다. NSDate 및 관련 항목을 살펴 보겠습니다. 감사. –

+0

또한 일, 년, 월, 분, 초 등의 원하는 날짜 변경 유형에 대해 좀 더 자세히 설명해야합니다. NSDate는 모든 변경 사항을 등록하며 원하는 변경 사항을 격리하는 것은 사용자의 몫입니다. – Dustin

+0

더스틴 (Dustin), 날짜 변경 유형이 다른 경우 답변을 실제로 변경합니까? 어쨌든 더 자세한 내용이없는 날짜는 단순히 하루의 이름입니다. 날짜가 매일 바뀝니다. 내가 누리고 싶은 이벤트는 매일하는 이벤트입니다. 그러나 일반적으로 그렇게 할 필요는 없습니다. 기본 상황은 현지 자정에 의해 유발되지만 다시는 필요하지는 않습니다. 테스트를 위해 예를 들어 잠깐 트리거를 사용할 것입니다. –

답변

2

이 경우 NSTimer을 사용할 수 있습니다. 먼저, NSTimer이 언제 발사되어야하는지 알아야합니다. 당신은 그것을 위해 NSDate, NSCalendarNSDateComponents 사용할 수 있습니다

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

철저한 답장을 보내 주셔서 감사합니다. –

+0

'tomorrowTimerDidFire :'에 다른 타이머를 만들고 싶다는 것을 잊어 버렸습니다. 왜냐하면'tomorrowTimerDidFire :'가 실행될 때, 오래된 내일이 오늘이고 새로운 내일에 다시 호출해야하기 때문입니다. –

+0

고마워요, 롭. 그게 제가 생각한 것입니다,하지만 좋은 생각은 그것을 언급했습니다. 이것은 또 다른 질문을 제기합니다. 타이머에 대한 나의 독서에서, 나는 끝날 때 타이머를 죽이는 언급을 보았습니다. 신경 쓰지 말라고? –

관련 문제