2012-11-04 66 views
1

我有一個有很多標籤的視圖,每個標籤對應一個星期的一天和一種任務。我想從核心數據加載信息並使用該信息來設置每個標籤的文本。從核心數據中載入日期

#import "WeekViewController.h" 

@implementation WeekViewController 

- (void) viewDidLoad { 

    gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
    [gregorian setFirstWeekday:2]; 

    mondayMeetings = 0; 
    mondayPhoneCalls = 0; 
    mondayToDos = 0; 

    tuesdayMeetings = 0; 
    tuesdayPhoneCalls = 0; 
    tuesdayToDos = 0; 

    wednesdayMeetings = 0; 
    wednesdayPhoneCalls = 0; 
    wednesdayToDos = 0; 

    thursdayMeetings = 0; 
    thursdayPhoneCalls = 0; 
    thursdayToDos = 0; 

    fridayMeetings = 0; 
    fridayPhoneCalls = 0; 
    fridayToDos = 0; 

    saturdayMeetings = 0; 
    saturdayPhoneCalls = 0; 
    saturdayToDos = 0; 

    sundayMeetings = 0; 
    sundayPhoneCalls = 0; 
    sundayToDos = 0; 

    [self loadInfo:[NSDate date]]; 

} 

- (void) loadInfo:(NSDate *)date { 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Date >= %@) AND (Date <= %@)", [self dateByMovingToBeginningOfWeek:self.selectedDate], [self dateByMovingToEndOfWeek:self.selectedDate]]; 

    request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Task" inManagedObjectContext:managedObjectContext]; 
    [request setEntity:entity]; 
    [request setPredicate:predicate]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptors release]; 
    [sortDescriptor release]; 

    NSError *error = nil; 

    mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
    if (mutableFetchResults == nil) { 

    } 

    for (int i = 0; i < [mutableFetchResults count]; i++) { 

     Task *aTask = (Task *)[mutableFetchResults objectAtIndex:i]; 

     NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:aTask.Date]; 

     int weekday = [comps weekday]; 

     if (weekday == 1 && [aTask.Type isEqualToString:@"PhoneCall"]) { 

      mondayPhoneCalls ++; 

     } 

    } 

    NSLog(@"%d", mondayPhoneCalls); 

    for (UILabel *go in [self.view subviews]) { 

     if (go.tag == 1) { 

      go.text = [NSString stringWithFormat:@"%i", mondayPhoneCalls]; 

     } 

    } 

} 

- (NSDate *) dateByMovingToEndOfWeek:(NSDate *)date { 
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekdayCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

    NSDateComponents *parts = [gregorian components:flags fromDate:date]; 

    [parts setWeekday:7]; 
    [parts setHour:23]; 
    [parts setMinute:59]; 
    [parts setSecond:59]; 

    return [gregorian dateFromComponents:parts]; 

} 

- (NSDate *) dateByMovingToBeginningOfWeek:(NSDate *)date { 

    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekdayCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

    NSDateComponents *parts = [gregorian components:flags fromDate:date]; 

    [parts setWeekday:0]; 
    [parts setHour:0]; 
    [parts setMinute:0]; 
    [parts setSecond:0]; 

    return [gregorian dateFromComponents:parts]; 

} 

@end 

但它只註冊一個任務,如果它的日期是當前日期(順便說一句)。任何人都可以想出一種更有效的方法來設置每個標籤的文本,而不是每個標籤都有一個出口,或者循環瀏覽所有視圖的子視圖並檢查它們的標籤?

任何幫助非常感謝。

回答

0

你的謂語現在說「對象的日期是今天或更晚的日期,其日期是今天或更早的日期」。滿足該要求的唯一對象是今天的日期。

對於您的其他問題,您可以查看IBOutletCollection。它們用於類似對象的集合(在你的情況下是UILabel)。它基本上是IB對象的NSArray,您可以循環並輕鬆設置它們的值。

+0

真的嗎?我試圖做的只是加載日期與選定日期相同的一週。我計劃通過使用兩種方法來做到這一點,其中一種方法返回所選日期所在星期的結尾,另一種方法返回一週的開始。所以我的謂詞至少應該說「對象的日期是一週或更晚的日期,以及本週末或更早的日期」 –

+0

對不起,錯過了那部分。看起來你的謂詞是正確的。我懷疑這是你的dateByMoving方法。您設置了NSDayCalendarUnit標誌,但是您將工作日更改爲7,原樣保持原狀。這就像說「給我2012年11月3日星期六的日期」 - 它不存在。通過確保它們返回的NSDate對象是正確的來驗證這些方法。 –