2010-07-20 96 views
1

我有我的iPhone应用程序中的分组风格的UITableView。 现在我想用图像,标签和活动指示器自定义节标题。如何在Interface Builder for iPhone中构建UITableView sectionHeader视图?

为此,我创建了一个新的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”...

在此先感谢, 马克。

+0

您可能希望从if()语句中取出返回值,它会引发警告,因为编译器在代码中运行,它不像我们那样遍历步骤,所以它会到达并没有得到“返回someObject”,并且它不知道你在结束之前已经抛出了一个值。我设置了一个tempObject:UIView * tempView; 然后,我将它设置为等于它在if()语句中所需的值,就像在返回[favoritesSectionHead视图]中一样;然后在该方法结束时,我返回tempObject,如“return tempView;”没有警告! – Newbyman 2010-07-30 02:06:52

回答

0

我不得不添加一个NSString属性到我的剖视图控制器。在viewDidLoad中,我将此字符串分配给UILabel文本属性,现在它正在工作。

1

我有与视图=(null)相同的问题。这完全是关于“代表”。我的tableView工作正常,所有我的UITableView委托方法正常工作,但viewForHeaderInSection:不会实现。

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

我还发现,Xcode将轻松地从viewForHeaderInSection:方法中推送一个“编码”自定义视图,使用这个相同的弱引用,但使用IB,链接必须更加成熟。需要多一点工作,但是一旦你开始构建更复杂的对象,它会提供更好的体验。我使用了:NSLog([NSString stringWithFormat:@"%@", self.headerView]);来验证视图输出为(null)。

viewForHeaderInSection:方法首先被调用,如果nil或null,则tableView调用下一个“titleForHeaderInSection:”。 (你也可以使用这个你的优势)。

确保你的设置是正确的,并且对这些对象如何相互配合有意义。

样的步骤,为我工作:
(.H)


  1. 正确设置一个的viewController,并声明的tableView委托方法。我正在使用通用的UITableViewController,在复杂的TabBar中并没有为我工作,并带有UINavigationControllers。

    @interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate> { 
    
  2. 创建所有IBOutlets,这将是对你的看法:

    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; 
    

(.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. 用“LIST”查看您的对象VIEW“,提供更好的理解和对象层次结构
    2. 右键单击”文件所有者“,显示所有IBOutlet;
    3. 将所有IBOutlet连接从文件所有者拖到它们控制的对象;即(yourTableView - >的tableView)或yourCustomHeaderView - >自定义视图,你设计)和(yourImage - 你掉在您的自定义视图>自定义的UIImageView

现在,连接完成通过设置该项目的任何属性,例如self.yourCustomHeaderView.background = [UIColor redColor]; etc....

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


这只是最简单的步骤,就可以使视图复杂,因为你需要它,一个我viewForHeaderInSection的:观点有40+ IBoutets所有的意见,其中包括按钮,图像,标签,其他意见等...


真的试图保留'代码块'中的所有代码,只是不会工作,但你仍然可以阅读它。

+0

嗨Newbyman,谢谢你的非常详细的答案。 正如你在上面的答案中看到的,我的问题是一个不同的问题(我没有正确地遵循MVC模式),但我相信别人会遇到你的解决方案适合的问题,并很乐意在这里找到它! – Cornelius 2010-08-04 10:31:43

1

您的看法尚未加载。这就是为什么它是零。在ViewDidLoad中执行修改代码。

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

相关问题