Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将UIView放入UITableView标题中_Iphone_Objective C - Fatal编程技术网

Iphone 将UIView放入UITableView标题中

Iphone 将UIView放入UITableView标题中,iphone,objective-c,Iphone,Objective C,我有一个UITableView,它在我的xib文件中。我为控制器创建了如下属性: @property (nonatomic, retain) IBOutlet UITableView *myTableView; [self.myTableView setTableHeaderView:self.myTableHeaderView]; 现在,我想要一个表视图标题(不是每个部分的标题)。因此,因为我想要自定义样式,我创建了一个新的带有视图的xib文件(并且我连接到我的控制器,它实现了myTabl

我有一个UITableView,它在我的xib文件中。我为控制器创建了如下属性:

@property (nonatomic, retain) IBOutlet UITableView *myTableView;
[self.myTableView setTableHeaderView:self.myTableHeaderView];
现在,我想要一个表视图标题(不是每个部分的标题)。因此,因为我想要自定义样式,我创建了一个新的带有视图的xib文件(并且我连接到我的控制器,它实现了
myTableView

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

@property (nonatomic, retain) IBOutlet UITableView *myTableView;
[self.myTableView setTableHeaderView:self.myTableHeaderView];
其中
myTableViewHeader
是控制器中的UIView属性

不幸的是,UITableView不会显示此UIView,因此我的问题是,如何将UIView放到UITableView的标题中


提前感谢您并致以最良好的问候。

有几件事需要检查:

  • myTableHeaderView还必须是IBOutlet,或者在类中的某个位置用代码创建

  • 尝试将self.myTableHeaderView添加为表头视图时,它不能为nil。如果为零,则说明您没有正确连接插座

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

MyTableViewHeader.xib的文件所有者必须是TableViewController子类,并且必须将myTableHeaderView对象连接到文件所有者的相应出口

编辑:在回答“什么是
[[NSBundle mainBundle]loadNibNamed:@“MyTableViewHeader”所有者:自我选项:nil];
”时

这一小行包含了一种魔力,可以让您了解XIB文件和Objective-C对象在Cocoa(touch)中是如何协同工作的,从而将您的iOS编程技巧提升到全新的水平。有两类Cocoa程序员,一类了解它的功能、使用和受益于它,另一类还不知道自己遗漏了什么,而是在荒野中蹒跚前行,试图为自己的对象创建XIB文件,却始终无法让它正常工作

随着这场大规模的集结,以下是细节:

XIB(NIB)文件是归档的Objective-C对象(以及对不在XIB中的对象的引用,如“文件所有者”,即所谓的“代理对象”)和这些对象之间的连接的集合。加载XIB文件时,这些存档对象将以其保存到XIB中的状态完全激活,然后根据XIB文件中记录的连接建立这些活动对象(和“代理对象”)之间的连接

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

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

这一切看起来像是魔术,发生在

(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
方法初始化新的UIViewController子类时

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

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

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

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

[[NSBundle mainBundle] loadNibNamed:@"MyXIBFileToLoad" owner:theOwner options:nil];
。。瞧!现在,“所有者”中连接到MyXIBFileToLoad.xib中对象的任何nil IBOutlet都已设置为从xib文件加载的新对象

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


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

我添加了这一行
[[NSBundle mainBundle]loadNibNamed:@“MyTableViewHeader”所有者:自我选项:nil]然后它就工作了。这有什么用?接受我的回答,我很乐意填写细节:)。只是开玩笑,我还是会告诉你的,但是请接受答案。这是真的,笔尖是一件美丽的事情!我(有时)感兴趣的是,比如说,有一个UITableView表头,有一个具有基本布局的NIB(XIB)。。。但事实证明,其中一些UILabel字段实际上会改变高度(0行,自然)。所以,你把所有的东西都装上美味的文字,然后打你的sizeToFit电话,这一切都很好。。。但是现在你必须把所有的东西都挖出来