从UITableView中删除没有行的部分

时间:2012-03-08 16:43:56

标签: objective-c uitableview ios5

如果该部分没有行,我想从UITableView中删除节标题。

我正在使用UILocalizedIndexedCollation作为我的部分标题。因此,当我创建标题时,我不一定知道哪些部分会有内容。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    //return [customerSections count];
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return 1;
    }
    return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //NSLog(@"Section: %i", section);
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return self.filteredCustomers.count;
    } else {
        return [[self.customerData objectAtIndex:section] count];
    }
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    // The header for the section is the region name -- get this from the region at the section index.

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return nil;//@"Results";
    }
    return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:section];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    //return [customerSections allKeys];
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return nil;
    }
    return [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
}

5 个答案:

答案 0 :(得分:10)

只是想加入并提出我的解决方案

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if ([self.myTableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
        return nil;
    }
    return [[self.collation sectionTitles] objectAtIndex:section];

}

based on this answer

答案 1 :(得分:3)

我最近用这段代码实现了这个目标:

这是返回该部分标题的函数,如果该部分中没有行,则不返回标题:

  - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
     if ([self.customerData count] > 0 ) {
             return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:section];
        }
    return nil;
}

答案 2 :(得分:2)

这是一个有趣的问题,有许多可能的解决方案。

向后工作,numberOfSectionsinTableViewnumberOfRowsInSection是需要更新的内容,以便显示正确数量的部分。这些部分取决于方法UILocalizedIndexedCollation方法。

(推测这是在某种用户操作(删除或插入)之后发生的,所以请注意commitEditingStyle中应该调用[self.tableView reloadData)。

我假设customerData是一个数组,其中每个索引都有一个对应于一个部分的可变数组。当某个customerData索引处的数组没有数据时,您希望删除该索引的部分。

然后,解决方案是手动计算所有内容 - 根据customerData数组中的生命确定部分信息。 我重写了你的三种方法。祝你好运!

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return nil;
    }
   NSMutableArray *arrayToFilter = [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];

   //This is the key - recalculate index titles based on what's present in customerData
   for (int i = [self.customerData count] -1; i >=0 ; i--) {
       if (![[self.customerData objectAtIndex:i] count]) {
            [self.arrayToFilter removeObjectAtIndex:i];
       }
   }
   return arrayToFilter;
}

//You need to be calculating your table properties based on the number of objects
//rather of the 'alphabet' being used.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    //return [customerSections count];
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return 1;
    }
    //return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] count];
    int populatedArrayCounter = 0;        
    for (int i = 0; i <[self.customerData count]; i++) {
        if ([[self.customerData objectAtIndex:i] count]) {
            populatedArrayCounter++;
        }
    }
    return populatedArrayCounter;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //NSLog(@"Section: %i", section);
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return self.filteredCustomers.count;
    } else {
        // Your original line requires changing, because there are customerData array objects with a count of 0, and you don't want any sections like that
        // Thus, pick from the set of populated arrays.
       NSMutableArray populatedArrays = [[NSMutableArray alloc] init];        
       for (int i = 0; i <[self.customerData count]; i++) {
           if ([[self.customerData objectAtIndex:i] count]) {
               [populatedArrays addObject:i];
           }
       }
       return [[populatedArrays objectAtIndex:section] count];;
    }
}

答案 3 :(得分:1)

我最终删除了未使用的sectionIndexTitles并根据它创建了部分。

在我的NSURLConnection requestDidFinish中,我使用了以下内容。

self.customerData = [self partitionObjects:[self customers] collationStringSelector:@selector(self)];

然后

-(NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector
{
    sectionIndexTitles = [NSMutableArray arrayWithArray:[[UILocalizedIndexedCollation currentCollation] sectionIndexTitles]];
    UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
    NSInteger sectionCount = [[collation sectionTitles] count];
    NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];

    for (int i = 0; i < sectionCount; i++) {
        [unsortedSections addObject:[NSMutableArray array]];
    }

    for (id object in array) {
        NSInteger index = [collation sectionForObject:[object objectForKey:@"name"] collationStringSelector:selector];
        [[unsortedSections objectAtIndex:index] addObject:object];
    }

    NSMutableArray *sections = [NSMutableArray array];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSUInteger lastIndex = 0;
    NSMutableIndexSet *sectionsToRemove = [NSMutableIndexSet indexSet];
    for (NSArray *section in unsortedSections) {
        if ([section count] == 0) {
            NSRange range = NSMakeRange(lastIndex, [unsortedSections count] - lastIndex);
            [sectionsToRemove addIndex:[unsortedSections indexOfObject:section inRange:range]];
            lastIndex = [sectionsToRemove lastIndex] + 1;

        } else {
            NSArray *sortedArray = [section sortedArrayUsingDescriptors:sortDescriptors];
            [sections addObject:sortedArray];
        }
    }

    [sectionIndexTitles removeObjectsAtIndexes:sectionsToRemove];

    return sections;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.

    if (self.searchDisplayController.active) {
        return 1;
    }
    return [sectionIndexTitles count];//[[[UILocalizedIndexedCollation currentCollation] sectionTitles] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    if (self.searchDisplayController.active) {
        return self.filteredCustomers.count;
    } else {
        return [[self.customerData objectAtIndex:section] count];
    }
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    if (self.searchDisplayController.active) {
        return nil;
    }

    return [sectionIndexTitles objectAtIndex:section];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{

    if (self.searchDisplayController.active) {
        return nil;
    }

    return sectionIndexTitles;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return index;//[[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
}

使用上述所有代码,这将删除屏幕右侧未使用的字母以及没有行的节标题。

答案 4 :(得分:0)

我想在swift中分享我的解决方案

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if self.sections[section].isEmpty
    {
        return nil
    }
    else
    {
        return collation.sectionTitles[section]
    }
}