【问题标题】:UITableView Section Header issueUITableView 部分标题问题
【发布时间】:2011-10-25 18:07:57
【问题描述】:

全部,

我有一个分组的 UITableView,可能共有 3 个部分。可能有 1、2 或 3 个。

我的问题是,对于每个部分,我使用不同的页眉和页脚视图。我通过检查 # 部分来选择要显示的页眉/页脚。

这显然行不通,因为第 0 部分并不总是代表“标题”0 显示的内容。

示例: 标题#0 =“游戏进行中”。但是数据库没有返回正在进行的游戏。只有“Games Ended”存在。因此第 0 部分将是所有“Games Ended”。我不希望“Games Ended”使用“Games in Progress”标题。

我找不到检查节值而不是数字的方法。

简单地说,我希望能够显示节名#3 的节标题#3,即使节名#3 是节#0。

我知道这似乎微不足道,而且可能很简单......但我被困住了。任何帮助表示赞赏。

谢谢。

----- 代码-----

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {


    return [[fetchedResultsController_ sections] count];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController_ sections] objectAtIndex:section];


    return [sectionInfo numberOfObjects];
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {


    if(section == 0)
    {
        return 50.0f;
    }
    else if (section == 1)
        return 50.0f;

    else
        return 50.0f;


}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {


    if(section == 0 )
    {
        return 50.0f;
    }
    else if (section == 1)
        return 5.0f;

    else
        return 80.0f;


}



- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    if(section == 0)
    {
        return headerView1;
    }
    else if (section == 1)
        return headerView2;

    else
        return headerView3;

}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {

    if(section == 0)
    {
        return footerView1;
    }
    else if (section == 1)
        return footerView2;

    else
        return footerView3;

}

【问题讨论】:

  • 请包含您当前用于返回节标题的代码。

标签: iphone ios tableview


【解决方案1】:

显然,通过检查 # 部分来决定显示哪个页眉/页脚是错误的(这是错误的 MVC)。为了解决您的问题,最好查看一些实际代码,尽管我认为我可以提出一般性建议:
您显示的部分取自某些数据源 - 数组、字典或其他集合(这是您用来确定的同一集合,例如,numberOfSectionsInTableView: 委托方法的返回值。如果您没有'还没有这样做,您应该将这些数据实例合并到一些包含数据本身的对象中(这是您通常需要的数据,用于显示单元格/页眉/页脚元素以及实际数据值) - 在这个对象中,添加一个额外的“HeaderType”枚举值,以便每个对象“知道”它应该如何显示。
这样您的 MVC 是完美的:您将数据存储在自定义对象的集合中,您的控制器知道如何按类型显示数据,当然您的视图会根据控制器的说明正确显示数据。 下面是一个可以提供帮助的枚举示例:

typedef enum {
 kHeaderTypeGameProgress,
 kHeaderTypeGameStats,
 kHeaderTypeGameDate
} HeaderType;

在您的“viewForHeader”或“viewForFooter”方法中,只需添加一个开关类型来检查数据的 HeaderType 并相应地创建一个视图。希望我有所帮助,祝你好运!

【讨论】:

  • 谢谢。在发布此问题之前,我遇到了您的一个类似主题。我的数据源是使用核心数据的 Sqlite DB。我使用 fetchedResultsController 来返回数据。并定义了“sectionKey”。我的问题是在执行页眉/页脚代码之前获取此 sectionKey 值。我一定遗漏了一些非常基本的东西......我需要做的就是评估这个 sectionKey 值..
  • 为什么不在加载 tableView 之前只预加载确定视图类型所需的数据?
【解决方案2】:

似乎在你的 cellForRowAtIndexPath 中,你必须已经有一些逻辑来决定从哪个组显示数据,可能是这样的:

 NSArray *group;
 int section = indexPath.section;
 if (![gamesInProgress count]) section++;
 switch (section) {
     case 0:
          group = gamesInProgress;
          break;
     case 1:
          group = finishedGames;
          break;
     // etc.
}

在您的 viewForHeaderInSection 中,编写类似的代码来设置 NSString 而不是 NSArray。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2012-04-05
    • 1970-01-01
    相关资源
    最近更新 更多