我有一个UITableView
,我想在其上添加44px子视图。我尝试了tableViewHeader
,但是滚动了表格的其余部分。
我尝试搜索并发现很多人说我需要添加一个UIView超级视图,然后将我的标题和UITableView添加到它。但是我找不到一个关于如何做到这一点的例子。我尝试创建一个新的UIView子类并在IB中布置子视图,但是我遇到了让桌面控制器与UITable链接的问题(因为我对IB知之甚少)。
如何使用XIB 执行此操作?有人可以提供一个例子吗?
感谢您提供任何帮助。
答案 0 :(得分:34)
我终于在发布后想出了这个。数据。 :)
这就是我所做的,以防其他人遇到同样的问题:
删除现有的UITableViewController
及其XIB。他们是垃圾。你真的很生气。
使用XIB创建一个新的UIViewController
子类
在IB中打开XIB并将标题内容和UITableView
添加到UIView
在UITableView
的IB Outlets中,确保将Delegate和DataSource连接到文件所有者
在视图控制器的标头中,请务必添加<UITableViewDelegate, UITableViewDataSource>
以实现这些协议
实施您熟悉和喜爱的所有常规UITableView
委托和数据来源方法,但使用的是UIViewController
,而不是您通过UITableViewController
习惯的方式
此后事情应该有效。
答案 1 :(得分:9)
问题是,UITableViewController的view属性与tableView属性相同。我有同样的问题,想在表格上方放置一些固定的内容。我不想更改基类,因为它提供了许多我不想丢失或破坏的强大功能。
修复实际上很简单。诀窍是为self.tableView属性创建自定义集和get。然后,在loadView中,用新的UIView替换视图并将tableView添加到它。然后你可以在tableView周围添加子视图。以下是它的完成方式:
在标题中:
@interface CustomTableViewController : UITableViewController
{
UITableView *tableView;
}
在.m:
- (UITableView*)tableView
{
return tableView;
}
- (void)setTableView:(UITableView *)newTableView
{
if ( newTableView != tableView )
{
[tableView release];
tableView = [newTableView retain];
}
}
- (void)loadView {
[super loadView];
//save current tableview, then replace view with a regular uiview
self.tableView = (UITableView*)self.view;
UIView *replacementView = [[UIView alloc] initWithFrame:self.tableView.frame];
self.view = replacementView;
[replacementView release];
[self.view addSubview:self.tableView];
//code below adds some custom stuff above the table
UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
customHeader.backgroundColor = [UIColor redColor];
[self.view addSubview:customHeader];
[customHeader release];
self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height);
}
享受!
答案 2 :(得分:1)
作为一个选项,可以将 UITableViewController 作为UI的一部分嵌入到另一个 UIViewController 中,并使用&#39; 容器视图&#39 ; element(在Interface Builder中从Object库中选择一个(其他所有视图都是))。
这样你就可以像普通视图一样使用UITableViewController(就定位而言)并编写你需要的任何布局而不会覆盖现有的表视图代码
编辑:
为了进一步扩展我的答案,以下是完成所述方法的步骤:
ViewController
拖放新的Object Library
元素到故事板以添加新控制器。作为子视图,请从对象库中拖放Container View
并将其放在ViewController
Container View
创建了另一个视图控制器&#34; embedded&#34; segue作为一种联系。保存以删除此viewcontroller
并将Container View
与所需的view controller
相关联(根据问题&lt; UITableViewController)
Container View
与UITableViewController
连接,只需选择container view
并按住+拖动到UITableViewController - 选择&#34;嵌入&#34;在弹出菜单中现在,控制器将在Container View
内显示容器的位置和边界。
可以获得到嵌入式视图控制器的链接 - 系统将触发&#34; prepareForSegue&#34;主机viewcontroller的方法(在上面的步骤1中创建),控制器在segue.destinationViewController属性中 - 可以根据需要自定义它。只需确保为&#34;嵌入式&#34;设置标识符。接口构建器中的segue - 这与任何其他segue的过程相同。
答案 3 :(得分:1)
用ViewController替换TableViewController,在里面添加一个固定高度的UIView来放置你需要的固定内容,然后添加一个UITableView。
为TableView创建一个插座
@IBOutlet weak var tableView: UITableView!
您可以重复使用已删除覆盖字的所有功能,例如
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let c = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell!
c.textLabel?.text = "A title"
c.detailTextLabel?.text = "A subtitle"
return c
}
如果需要,请参阅此答案以添加自动刷新控件Pull to refresh UITableView without UITableViewController
答案 4 :(得分:0)
在storyboard或xib中定义自定义UIView,在View Controller中为该UIView提供IBOutlet参考。在-(void)viewWillAppear:(BOOL)animated
方法中写[self.tableView.superview addSubview:filterHeaderView];
,此处filterHeaderView
是我的标题视图的IBOutlet参考,我想在我的tableview中添加为固定标题。