如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?

Posted

技术标签:

【中文标题】如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?【英文标题】:How to build UITableView sectionHeader views in Interface Builder for iPhone? 【发布时间】:2010-07-20 19:16:38 【问题描述】:

我的 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”...

提前致谢, 标记。

【问题讨论】:

你可能想从你的 if() 语句中拉出返回值,它会抛出警告,因为编译器运行代码,它不会像我们一样通过步骤,所以它到达终点并且没有得到“返回 someObject”,并且它不知道您在到达终点之前已经抛出了一个值。我设置了一个 tempObject,例如: UIView *tempView;然后我将它设置为等于 if() 语句中所需的值,如您的 return [favoritesSectionHead view];然后在方法结束时,我返回 tempObject,如“return tempView;”没有警告! 【参考方案1】:

您的视图尚未加载。这就是为什么它为零。在 ViewDidLoad 中做你的修改代码。

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

【讨论】:

【参考方案2】:

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

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

我还发现 Xcode 可以很容易地从 viewForHeaderInSection: 方法中推送一个“编码的”自定义视图,使用同样的弱引用,但是使用 IB,链接必须更加建立。需要更多的工作,但一旦你开始构建更复杂的对象,就会提供更好的体验。

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

首先调用viewForHeaderInSection:方法,如果为nil或null,tableView接下来调用"titleForHeaderInSection:"。 (您也可以利用它来发挥自己的优势)。

确保您的设置是正确的,并且对对象如何相互工作有意义。

对我有用的示例步骤: (.h)


    正确设置 viewController,并声明 tableView 委托方法。我使用的是通用的 UITableViewController,在复杂的 TabBar 中对我不起作用,使用 UINavigationControllers。

    @interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate> 
    

    创建所有显示在您视野中的 IBOutlets:

    IBOutlet UITableView *myTableView;
    IBOutlet UIView *yourCustomHeaderView;
    IBOutlet UIImageView *yourImageOnCustomView;
    

    Assign 内存分配分配:

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

(.m)


    综合你的变量:

    @synthesize yourTableView, yourCustomHeaderView, yourImageOnCustomView;
    

    实现所有标准 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;
    
    

    在 IB 中建立所有联系,最简单的方法:

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

现在已经建立了连接,您可以“完全”控制每个项目的各个方面,方法是设置该项目的任何属性,例如 self.yourCustomHeaderView.background = [UIColor redColor]; etc....

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


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


真的试图将所有代码保留在“代码块”中,只是行不通,但您仍然可以阅读它。

【讨论】:

嗨 Newbyman,感谢您非常详细的回答。正如您在上面的答案中看到的那样,我的问题是另一个问题(我没有正确遵循 MVC 模式),但我相信其他人会遇到您的解决方案适合的问题,并且很高兴在这里找到它! 【参考方案3】:

我必须在我的剖面视图控制器中添加一个 NSString 属性。在 viewDidLoad 中,我将此字符串分配给 UILabel 文本属性,现在它可以工作了。

【讨论】:

以上是关于如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用主 iPhone 视图之外的 UI 元素在 Interface Builder 中设置 UIScrollView?

在 Interface Builder 中为 Iphone 创建弹出视图控制器

如何更改实体(iphone)的属性值?

如何将iphone设备连接到非iphone设备?

如何为 iPhone 创建自定义 Interface Builder 插件?

Interface builder和iphone sdk