如何在Interface Builder for iPhone中构建UITableView sectionHeader视图?

时间:2010-07-20 19:16:39

标签: iphone uitableview uiviewcontroller interface-builder

我的iPhone应用程序中有一个分组样式的UITableView。 现在我想使用图像,标签和活动指示器自定义节标题。

为此,我创建了一个新的UIViewController子类和一个XIB文件。我将UIImageView,UILabel和UIActivityIndi​​catorView作为IBOutlet属性添加到ViewController,并将它们连接到我在Interface Builder中放入XIB的控件。

在我的UITableView制作的类中,我设置了节标题(两个,上面定义的ViewController的两个实例)并设置它们的属性(图像和文本)。然后我返回tableView委托中的ViewControllers视图:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        return [favoritesSectionHead view];
    } else {
        return [serverlistSectionHead view];
    }
}

这显示了我在Interface Builder中定义的视图,没有自定义图像和文本。 我知道为什么会发生这种情况(ViewController的视图是在第一次需要时创建的,在我的代码中这是当我在viewForHeaderInSection方法中返回它时 - >当我尝试设置自定义值时视图仍为零)但是我不知道如何解决这个问题。

你能帮帮我吗?在返回之前,我需要做什么来启动视图? UITableView文档告诉我不要手动调用“loadView”...

提前致谢, 标记

3 个答案:

答案 0 :(得分:1)

我对view =(null)有同样的问题。这都是关于“代表”的。我的tableView工作正常,我的所有UITableView Delegate方法都正常工作,但是viewForHeaderInSection:不会实现。

我发现Xcode让我使用TableView建立弱链接引用,这对于“viewForHeaderInSection:”方法来说是不够的。

我还发现Xcode可以轻松地从viewForHeaderInSection:方法中推送“编码”自定义视图,使用相同的弱引用,但是使用IB,链接必须更加成熟。需要多做一些工作,但是一旦你把它弄下来构建更复杂的对象,就会提供更好的体验。

我使用:NSLog([NSString stringWithFormat:@"%@", self.headerView]);来验证视图输出为(null)。

首先调用viewForHeaderInSection:方法,如果为nil或null,则tableView将调用“titleForHeaderInSection:”。 (你也可以利用这个优势)。

确保您的设置正确,并确定对象如何相互协作。

适合我的示例步骤:
(.h)中


  1. 正确设置viewController,并声明tableView委托方法。我使用的是通用的UITableViewController,在使用UINavigationControllers的复杂TabBar中无效。

    @interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate> {
    
  2. 创建将在您的视图中的所有IBOutlet:

    IBOutlet UITableView *myTableView;
    IBOutlet UIView *yourCustomHeaderView;
    IBOutlet UIImageView *yourImageOnCustomView;
    
  3. 分配内存分配分配:

        @property(nonatomic,retain) IBOutlet UITableView *yourTableView;    
        @property(nonatomic,retain) IBOutlet UIImageView *yourCustomHeaderView;
        @property(nonatomic,retain) IBOutlet UIImageView *yourImageOnCustomView;
    
  4. (M)


    1. 合成您的变量:

      @synthesize yourTableView, yourCustomHeaderView, yourImageOnCustomView;
      
    2. 实现所有标准的TableView委托所需方法,以及:

      -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
      
          //Intialize the header View to present:
          UIView *headerView;
      
          //Display Section Headers for rows:
          if (section == 0) {headerStatBar = self.yourCustomSectionHeaderView1;}
          if (section == 1) {headerView = self.yourCustomSectionHeaderView1;} 
          if (section == 1) {headerView = self.yourCustomSectionHeaderView1;}
      
          //Return the view to the Table:
          return headerView;
      }
      
    3. 以最简单的方式在IB中建立所有连接:

      1. 使用“列表视图”查看对象,提供更好的理解和对象层次结构
      2. 右键单击“文件所有者”,以显示所有IBOutlet;
      3. 将所有IBOutlet连接从文件所有者拖到他们控制的对象;即(yourTableView - &gt; tableView)或yourCustomHeaderView - &gt;您设计的自定义视图)和(yourImage - &gt;您在自定义视图中删除的自定义UIImageView。

    4. 现在已建立连接,您可以通过设置该项目的任何属性(例如self.yourCustomHeaderView.background = [UIColor redColor]; etc....

      )对每个项目的方面进行“全面”控制

      **确保从“TableView”拖动到“文件所有者”,将表(委托)和(数据源)设置回文件所有者;这恰好是所有tableView委托方法的所在!


      这只是最简单的步骤,你可以根据需要使视图变得复杂,我的一个viewForHeaderInSection:视图有40多个IBoutets用于所有视图,包括按钮,图像,标签,其他视图等...

      <小时/> 真的试图将所有代码保存在“代码块”中,但是不行,但你仍然可以阅读它。

答案 1 :(得分:1)

您的视图尚未加载。这就是为什么它没有。在ViewDidLoad中执行修改代码。

我有一个类似的问题,我在初始化标题后尝试编辑标签值,但我的标签都是零。我通过从标题视图控制器的viewDidLoad方法调用标签修改代码来解决问题。

答案 2 :(得分:0)

我必须在部分视图控制器中添加NSString属性。在viewDidLoad中,我将此字符串分配给UILabel文本属性,现在它正在工作。