修复了UITableview的头文件?

我有一个UITableView ,我想坚持一个44px子视图的顶部。 我试过tableViewHeader ,但滚动表的其余部分。

我试过search,发现很多人说我需要添加一个UIView超级查看,然后添加我的头和UITableView到它。 不过,我无法find一个如何做到这一点的例子。 我尝试制作一个新的UIView子类,并在IB中布局子视图,但是我遇到了麻烦,让表控制器与UITable链接(因为我对IB不够了解)。

我怎样才能用XIB做到这一点 ? 有人可以提供一个例子吗?

感谢您提供的任何帮助。

发布后,我终于明白了这一点。 人物。 🙂

以下是我所做的,以防其他人遇到同样的问题:

  1. 删除现有的UITableViewController及其XIB。 他们是垃圾。 当你这样做的时候真的很生气。

  2. 用XIB创build一个新的UIViewController子类

  3. 在IB中打开XIB,并将你的头文件和一个UITableViewUIView

  4. UITableView的IB Outlets中,请确保将Delegate和DataSource连接到文件所有者

  5. 在你的视图控制器的头文件中,一定要添加<UITableViewDelegate, UITableViewDataSource>来实现这些协议

  6. 实现你所知道和喜欢的所有常规UITableView委托和数据源方法,但在你的UIViewController而不是你习惯通过UITableViewController

之后这件事情应该工作。

问题是,UITableViewController的view属性和tableView属性是一样的。 我也有同样的问题,想把一些固定的内容放在桌子上面。 我不想改变基类,因为它提供了很多很棒的function,我不想丢失或中断。

修复其实很简单。 诀窍是创build自定义设置并获取self.tableView属性。 然后,在loadView中,用新鲜的UIViewreplace视图并添加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); } 

请享用!

用ViewControllerreplaceTableViewController,在里面添加一个固定高度的UIView放置你需要的固定内容,在下面添加一个UITableView。

创build一个出口到你的TableView

  @IBOutlet weak var tableView: UITableView! 

例如,您可以重新使用所有已删除覆盖词的funcs

 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 } 

看到这个答案添加自动刷新控制,如果你需要它拉UITableView刷新UITableViewController

作为一个选项,可以将UITableViewController作为UI的一部分embedded到具有“ 容器视图 ”元素的另一个UIViewController中 (从Object库(其中所有其他视图都可以)在Interface Builder中select一个)。

这样你就可以像普通视图一样使用UITableViewController(就定位而言)并且组合你需要的任何布局,而不会覆盖现有的表视图代码

编辑:

为了进一步扩大我的答案,下面是完成所描述的方法的步骤:

  1. 在界面构build器中打开你的故事板
  2. Object Library拖放一个新的ViewController元素到故事板,添加一个新的控制器。
  3. 作为子视图,从对象库拖放“ Container View并将其放置在ViewController任何位置

  4. Container View创build另一个视图控制器和“embedded”作为连接segue。 这是保存删除此view controller和连接Container View与所需的view controller (根据问题是它的UITableViewController)

  5. 要连接Container ViewUITableViewController只需selectcontainer view和控制+拖动到UITableViewController – select“embedded”在popup菜单

现在,控制器将在Container View内显示容器的位置和边界。

有可能得到一个到embedded式视图控制器的链接 – 系统会触发主机视图控制器的prepareForSegue方法(在上面的步骤1中创build),并且控制器在segue.destinationViewController属性中 – 可以根据需要自定义它。 只要确保在接口生成器中为“embedded”segue设置一个标识符 – 就像其他segues一样,这个过程也是一样的。

在storyboard或xib中定义一个自定义的UIView,并在View Controller中为该UIView提供一个IBOutlet引用。 在-(void)viewWillAppear:(BOOL)animated方法write [self.tableView.superview addSubview:filterHeaderView]; ,在这里filterHeaderView是我的标题视图的IBOutlet引用,我想添加为我的tableview中的固定标题。