2013-03-10 1 views
1

TableView에 이벤트 목록을 표시하는 응용 프로그램과 함께 사용하고 있습니다. 행/셀당 이벤트 제목과 날짜를 보여주는 이벤트가 있습니다. 문제는 하루에 2 개 이상의 이벤트가있을 때 앱이 셀당 멋지게 보이지만 사용자가 2 회 이상 반복적으로 날짜를 볼 수있어 비효율적이며 다소 중복되는 것입니다. 그래서 내 생각은 이전 셀 날짜가 현재 셀 날짜와 비슷하며 현재 셀 날짜가 숨겨져 있는지 확인하는 것이 었습니다 (완전히 제거 할 수 없어 사용자가 일정에 이벤트를 저장할 수 있음).iOS UITableView 행에서 이중 값을 숨기는 방법

외부 XML을 TouchXML을 통해 SQLite 데이터베이스로 읽는 중입니다.

-(void) grabXMLData:(NSString *)dataAddress { 

    _managedObjectContext = [(DAFAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSURL *url = [NSURL URLWithString: dataAddress]; 
    CXMLDocument *xmlParser = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil]; 

    NSArray *resultNodes = NULL; 
    resultNodes = [xmlParser nodesForXPath:@"//month" error:nil]; 

    for (CXMLElement *resultElement in resultNodes) { 
     NSMutableDictionary *monthItem = [[NSMutableDictionary alloc] init]; 

     [monthItem setObject:[[resultElement attributeForName:@"name"] stringValue] forKey:@"name"]; 
     [monthItem setObject:[[resultElement attributeForName:@"month"] stringValue] forKey:@"month"]; 
     [monthItem setObject:[[resultElement attributeForName:@"year"] stringValue] forKey:@"year"]; 

     Month *aMonth = [NSEntityDescription insertNewObjectForEntityForName:@"Month" inManagedObjectContext:_managedObjectContext]; 
     aMonth.name = [monthItem objectForKey:@"name"]; 
     NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
     aMonth.month = [f numberFromString:[monthItem objectForKey:@"month"]]; 
     aMonth.year = [f numberFromString:[monthItem objectForKey:@"year"]]; 

     NSArray *itemNodes = [resultElement children]; 

     for (CXMLElement *resultItem in itemNodes) { 
      NSMutableDictionary *item = [[NSMutableDictionary alloc] init]; 

      [item setObject:[[resultItem attributeForName:@"id"] stringValue] forKey:@"id"]; 

      int counter; 
      for(counter = 0; counter < [resultItem childCount]; counter++) { 
       [item setObject:[[resultItem childAtIndex:counter] stringValue] forKey:[[resultItem childAtIndex:counter] name]]; 

      } 

      Item *aItem = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:_managedObjectContext]; 
      NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
      aItem.nr = [f numberFromString:[item objectForKey:@"id"]]; 
      aItem.title = [item objectForKey:@"title"]; 
      aItem.body = [item objectForKey:@"body"]; 
      aItem.date = [item objectForKey:@"date"]; 
      aItem.start = [item objectForKey:@"start"]; 
      aItem.end = [item objectForKey:@"end"]; 
     aItem.start2 = [item objectForKey:@"start2"]; 
      aItem.end2 = [item objectForKey:@"end2"]; 
      aItem.link_url = [item objectForKey:@"link_url"]; 
      aItem.month = aMonth; 
      [aMonth addItemObject:aItem]; 
     } 
    } 
} 

그것은 비교해야하는 항목 날짜 : 여기

내 코드의 샘플입니다.

Month *aMonth = [_stages objectAtIndex:indexPath.section]; 
    NSSortDescriptor *sortDescriptorItem = [NSSortDescriptor sortDescriptorWithKey:@"nr" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects: sortDescriptorItem, nil]; 
    _stagesPerMonth = [[aMonth.item allObjects] sortedArrayUsingDescriptors:sortDescriptors]; 
    Item *aItem = [_stagesPerMonth objectAtIndex:indexPath.row]; 
+0

귀하의 질문에 대한 명확하지 않습니다. 레이블의 숨겨진 속성을 사용하여 숨길 수 있으며 다음 행을 처리 할 때 이전 행의 데이터를 사용할 수 있어야합니다. – allprog

+0

아, Obj-C에서 최근에 소개 된 사전 및 사전을 처리하기위한 약자를 사용하는 것이 좋습니다. 가능한 한 제공합니다. 코드를 훨씬 쉽게 읽을 수있게 해줍니다. – allprog

+0

이전 행의 날짜 레이블에 같은 값이 있으면 날짜 정보가있는 레이블을 숨기고 싶습니다. 나는 잠시 머물러 있고 순간적으로 눈이 멀어서 이것을 깨닫는 데 아무런 단서가 없다. – iJar

답변

0

난 당신이 날짜를 표시하는 레이블이 사용자 정의 셀을 사용한다고 가정

이 내있는 tableview의 cellForRowAtIndex 코드의 일부입니다. cellForRowAtIndex에 대한 의사 코드는 다음과 같습니다

Item *aItem = [_stagesPerMonth objectAtIndex:indexPath.row]; 
NSDate thisDate = aItem.date; 

// Obtain the date of the previous event or nil if this is the first event 
NSDate prevDate = indexPath.row > 0 ? _stagesPeMonth[indexPath.row - 1].date : nil; 

// Date label is hidden if the previous date is the same as this. 
dateLabel.hidden = [thisDate isEqualToDate: prevDate]; 

구문은 귀하의 경우 다를 수 있습니다.

+0

많은 노력에 감사드립니다. 코드를 구현했는데 오류가 하나 있습니다. 문장의 경우 : 'NSDate prevDate = indexPath.row> 0? _stagesPerMonth [indexPath.row-1] .date : nil;'이 오류 (유형 ID의 객체에서 속성 날짜를 찾을 수 없음)가 표시됩니다. 무엇이 잘못 될지 생각해보십시오. – iJar

+0

나는 그것을 결코 신경 쓰지 않았다. 그것은 작동합니다! 귀하의 의견을 보내 주셔서 감사합니다. – iJar

+0

첫 번째 발췌 문장에서 다음과 같이 씁니다 :'aItem.date = [item objectForKey : @ "date"]'두 번째 스 니펫의 'Item'이 첫 번째 스 니펫과 같은 유형이라면 날짜 속성이 있어야합니다 그 위에. 그렇지 않으면이 이유 때문에 구문이 구문에 따라 다를 수 있다고 지적한 것입니다. 내 코드의 주석에 설명 된 논리를 구현하도록 코드를 변경하십시오. – allprog