如果该部分没有行,我想从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];
}
答案 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];
}
答案 1 :(得分:3)
我最近用这段代码实现了这个目标:
这是返回该部分标题的函数,如果该部分中没有行,则不返回标题:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if ([self.customerData count] > 0 ) {
return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:section];
}
return nil;
}
答案 2 :(得分:2)
这是一个有趣的问题,有许多可能的解决方案。
向后工作,numberOfSectionsinTableView
和numberOfRowsInSection
是需要更新的内容,以便显示正确数量的部分。这些部分取决于方法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]
}
}