【问题标题】:Put a UIView into a UITableView Header将 UIView 放入 UITableView Header
【发布时间】:2011-02-11 22:57:09
【问题描述】:

我的 xib 文件中有一个 UITableView。我为控制器创建了一个这样的属性:

@property (nonatomic, retain) IBOutlet UITableView *myTableView;

现在,我想要一个表格视图标题(不是每个部分的标题)。因此,因为我想要自定义样式,所以我创建了一个带有视图的新 xib 文件(并连接到实现了 myTableView 的控制器)。

然后我可以在我的控制器中写viewDidLoad

[self.myTableView setTableHeaderView:self.myTableHeaderView];

myTableViewHeader 是控制器中的 UIView 属性。

不幸的是,UITableView 不会显示这个 UIView,所以我的问题是,如何将一个 UIView 放到一个 UITableView 到 header 中?

在此先感谢您并致以最诚挚的问候。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    需要检查的几件事:

    • myTableHeaderView 也必须是 IBOutlet 或在您的 Class 中某处的代码中创建

    • 当您尝试将 self.myTableHeaderView 添加为表头视图时,它不能为 nil。如果它是 nil,那么你没有正确连接你的插座

    • 如果你已经在自己的 .xib 文件中设计了 IB 中的表视图标题,那么你必须在某个地方调用它(viewDidLoad 是个好地方):

    [[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];
    

    MyTableViewHeader.xib 的 File's Owner 必须是您的 TableViewController 子类,并且您必须将 myTableHeaderView 对象连接到 File's Owner 的相应出口。

    编辑:回答“[[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];”做什么?

    这一行包含了让您大开眼界的魔力,让您了解 XIB 文件和 Objective-C 对象如何在 Cocoa(触摸)中协同工作,将您的 iOS 编程功夫提升到全新的水平。有两类 Cocoa 程序员,一种是了解它的作用并从中受益的人,另一种是不知道自己缺少什么的人,而是在荒野中跌跌撞撞地尝试为他们的对象创建 XIB 文件和永远无法让它发挥作用。

    有了这么大的积累,下面是详细信息:

    XIB (NIB) 文件是归档的 Objective-C 对象的集合(以及对实际上不在 XIB 中的对象的引用,例如“文件所有者”,即所谓的“代理对象”)以及这些对象之间的连接。当加载 XIB 文件时,这些归档对象会以它们保存到 XIB 中的状态恢复,然后这些活动对象(和“代理对象”)之间的连接是根据到XIB文件中记录的连接。

    例如,在您的标准 UIViewController 子类 .xib 文件中,您将 File's Owner 设置为您的 MyViewController 类。 .xib 内部是一个 UIView 对象,它本身通常包含其他 UIKit 对象。 UIViewController 类的“视图”出口设置为指向 .xib 中的 UIView 对象。当这个 .xib 文件被加载时,UIView 对象被取消归档并成为一个活的 UIView 对象,所有的属性和设置都记录在 .xib 中。这就是“解档部分”。

    然后,由于 .xib 中从文件所有者(MyViewController 类)到 UIView 对象的连接,指向这个新 UIView 对象的指针存储在您的“视图”字段中MyViewController 实例。 .xib 文件中还存在的任何其他连接,如 UILabel、UIButton 操作等,也会设置到 MyViewController 中的任何其他“IBOutlet”字段。

    这一切似乎都像魔术一样发生在

    (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
    

    当你初始化一个新的 UIViewController 子类时的方法。

    现在好的部分:您可以自己将 nib 文件与对象关联起来!您可以使用loadNibNamed:owner:options 方法将任何 .xib 文件与您想要的任何对象中匹配的 nil IBOutlets 集相关联!!!

    突然之间,创建完全自定义的表格视图单元格、表格页眉、页脚等等变得轻而易举,您可以轻松编写模块化的可重用 UIView 组件等,所有这些都在 Interface Builder 中布局。

    您想用从 .xib 文件加载的对象填充其 nil IBOutlets 的对象是“所有者”对象。通常(但我不确定这是绝对必需的,any 具有相同类型和命名的 IBOutlets 设置为 File's Owner 的类可以工作),这是将被指定为“File's Owner”的类在xib中。

    好的,现在你已经有了 nil IBOutlets 的现有所有者对象(IBOutlets 必须为 nil 否则它们不会被更改,这是将 XIB 加载到所有者对象中的“规则”。一些 IBOutlets 是可以的不是零,当您加载 XIB 文件时它们不会被更改,通常这就是您想要的),并且您已经获得了包含要加载到所有者对象中的对象的 .xib 文件。你打电话:

    [[NSBundle mainBundle] loadNibNamed:@"MyXIBFileToLoad" owner:theOwner options:nil];
    

    .. 瞧!现在“theOwner”中任何与 MyXIBFileToLoad.xib 中的对象相连的 nil IBOutlets 都已设置为从 XIB 文件加载的新对象。

    (此外,此方法返回一个包含所有未从 xib 归档的对象的数组。如果您不关心设置任何所有者的出口,您可以按类和标签在此列表中搜索您的对象)。

    故事就是这样,现在开始疯狂地使用新方法将 Objective-C 类与存储在 XIB 文件中的对象关联起来!

    【讨论】:

    • 我添加了这一行[[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];,然后它就可以工作了。这是做什么的?
    • 接受我的回答,我很乐意填写详细信息:)。开个玩笑,无论如何我都会告诉你,但请务必接受答案。
    • 这是真的,他们的NIB是一件美丽的事情!对我来说(有时)变得有趣的地方是,比如说,你有一个 UITableView 表头,并且你有一个带有基本布局的 NIB(XIB)......但事实证明,其中一些 UILabel 字段会改变高度在实践中(0行,natch)。所以你用美味的文本加载它并调用你的 sizeToFit ,这一切都很好......但是现在你必须向下/围绕其他所有东西以适应高度变化,如果有不止一个,它会有点级联(而且经常有)。有什么技巧可以优雅地处理这个问题吗?
    • 我通过手动计算/设置所有单元格元素的 y 坐标相对于其正上方元素的 y 坐标来处理可变大小的 UILabel 的动态放置。从顶部开始,然后向下工作。不一定优雅,但它可以工作,而且我认为 iOS 不会为您提供基于约束的元素之间的放置(仅视图的边缘)。
    • 我已经知道了这一切,但还是很喜欢你的解释......荣誉!
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2015-10-09
    相关资源
    最近更新 更多