iOS如何隐藏UITableView行中的double值

问题描述:

我忙于在TableView中显示事件列表的应用程序。每行/单元格我有一个事件显示事件的标题和日期。现在的问题是,当一天有两个或更多事件时,应用程序现在可以很好地在每个单元格中显示它们,但用户会反复看到该日期2次或更多次,这看起来效率低下且有点多余。所以我的想法是检查前一个单元格的日期与当前单元格的日期是否相似,这会隐藏当前单元格的日期(我无法完全删除它,因为用户能够将事件保存到日历中)。iOS如何隐藏UITableView行中的double值

我正在通过TouchXML将外部XML读取到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]; 
     } 
    } 
} 

这是一个需要进行比较的项目日期。

这是我的tableview cellForRowAtIndex部分代码:

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 2013-03-10 10:44:32

+0

哦,我建议你使用shorthands来处理最近在Obj-C中引入的数组和字典。只要你可以。他们让你的代码更具可读性。 – allprog 2013-03-10 10:46:30

+0

如果日期标签具有相同的值,那么我想要做的就是隐藏带有日期信息的标签。我有点卡住,目前代码盲目,并不知道如何实现这一点。 – iJar 2013-03-10 11:24:30

我想你使用具有用于显示日期标签的自定义单元格。对于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 2013-03-10 12:57:25

+0

没关系我解决了它。有用!感谢您的输入。 – iJar 2013-03-10 13:26:03

+0

在你写的第一个代码片段中:'aItem.date = [item objectForKey:@“date”]'如果第二个片段中的Item与第一个片段中的Item相同,那么必须有一个date属性在上面。否则,这就是为什么我表示在你的情况下语法可能不同。尝试改变你的代码来实现我的代码中的评论中描述的逻辑。 – allprog 2013-03-10 13:27:49