修复了UITableview的头文件?
我有一个UITableView
,我想坚持一个44px子视图的顶部。 我试过tableViewHeader
,但滚动表的其余部分。
我试过search,发现很多人说我需要添加一个UIView超级查看,然后添加我的头和UITableView到它。 不过,我无法find一个如何做到这一点的例子。 我尝试制作一个新的UIView子类,并在IB中布局子视图,但是我遇到了麻烦,让表控制器与UITable链接(因为我对IB不够了解)。
我怎样才能用XIB做到这一点 ? 有人可以提供一个例子吗?
感谢您提供的任何帮助。
发布后,我终于明白了这一点。 人物。 🙂
以下是我所做的,以防其他人遇到同样的问题:
-
删除现有的
UITableViewController
及其XIB。 他们是垃圾。 当你这样做的时候真的很生气。 -
用XIB创build一个新的
UIViewController
子类 -
在IB中打开XIB,并将你的头文件和一个
UITableView
到UIView
-
在
UITableView
的IB Outlets中,请确保将Delegate和DataSource连接到文件所有者 -
在你的视图控制器的头文件中,一定要添加
<UITableViewDelegate, UITableViewDataSource>
来实现这些协议 -
实现你所知道和喜欢的所有常规
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(就定位而言)并且组合你需要的任何布局,而不会覆盖现有的表视图代码
编辑:
为了进一步扩大我的答案,下面是完成所描述的方法的步骤:
- 在界面构build器中打开你的故事板
- 从
Object Library
拖放一个新的ViewController
元素到故事板,添加一个新的控制器。 -
作为子视图,从对象库拖放“
Container View
并将其放置在ViewController
任何位置 -
Container View
创build另一个视图控制器和“embedded”作为连接segue。 这是保存删除此view controller
和连接Container View
与所需的view controller
(根据问题是它的UITableViewController) - 要连接
Container View
与UITableViewController
只需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中的固定标题。