将UIView放入UITableView标头中

Tim*_*Tim 7 iphone objective-c

我有一个UITableView,它位于我的xib文件中.我为控制器创建了这样的属性:

@property (nonatomic, retain) IBOutlet UITableView *myTableView;
Run Code Online (Sandbox Code Playgroud)

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

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

[self.myTableView setTableHeaderView:self.myTableHeaderView];
Run Code Online (Sandbox Code Playgroud)

其中myTableViewHeader是控制器中的UIView属性.

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

提前谢谢你和最诚挚的问候.

Bog*_*tyr 24

要检查的几件事:

  • myTableHeaderView也必须是一个IBOutlet,或者在某个类的某个地方的代码中创建

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

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

[[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];
Run Code Online (Sandbox Code Playgroud)

MyTableViewHeader.xib的文件所有者必须是您的TableViewController子类,并且必须将myTableHeaderView对象连接到File的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的Owner设置为MyViewController类..xib内部是一个UIView对象,它通常包含其他UIKit对象.UIViewController类的"view"出口设置为指向.xib中的UIView对象.加载此.xib文件时,UIView对象将被取消归档并成为一个活动的UIView对象,其中包含.xib中记录的所有属性和设置.这就是"解体部分".

然后,由于.xib中从File的Owner(MyViewController类)到UIView对象的连接,指向这个新UIView对象的指针存储在MyViewController实例的"view"字段中..xib文件中也存在的任何其他连接,如UILabels,UIButton操作等,也会设置到MyViewController中的任何其他"IBOutlet"字段.

这一切看起来都像魔术一样发生在

(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
Run Code Online (Sandbox Code Playgroud)

初始化新UIViewController子类时的方法.

现在好的部分:你可以自己做这种与对象关联的nib文件!您可以使用该loadNibNamed:owner:options方法将任何.xib文件与您想要的任何对象中的匹配的nil IBOutlet组相关联!

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

要使用从.xib文件加载的对象填充其nil IBOutlets的对象是"所有者"对象.通常(但我不确定这是绝对必需的,任何具有相同类型和命名的IBOutlets设置为文件所有者的类都可以工作),这是将在xib中指定为"文件所有者"的类.

好的,现在你已经拥有了nil IBOutlets的现有所有者对象(IBOutlets必须是nil或者它们不会被更改,这是将XIB加载到所有者对象的"规则".可以确定一些IBOutlet不是nil,它们只是在加载XIB文件时不会被更改,通常这就是你想要的,并且你的.xib文件包含你想要加载到所有者对象中的对象.你打电话:

[[NSBundle mainBundle] loadNibNamed:@"MyXIBFileToLoad" owner:theOwner options:nil];
Run Code Online (Sandbox Code Playgroud)

..瞧!现在,连接到MyXIBFileToLoad.xib中对象的"theOwner"中的所有nil IBOutlets都已设置为从XIB文件加载的新对象.

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

所以这就是故事,现在开始尝试将Objective-C类与存储在XIB文件中的对象相关联的新方法!

  • 接受我的回答,我很乐意填写详细信息:).开个玩笑,无论如何我都会告诉你,但请接受答案. (2认同)