修复了UITableview的标题?

时间:2011-08-05 03:50:42

标签: ios uitableview

我有一个UITableView,我想在其上添加44px子视图。我尝试了tableViewHeader,但是滚动了表格的其余部分。

我尝试搜索并发现很多人说我需要添加一个UIView超级视图,然后将我的标题和UITableView添加到它。但是我找不到一个关于如何做到这一点的例子。我尝试创建一个新的UIView子类并在IB中布置子视图,但是我遇到了让桌面控制器与UITable链接的问题(因为我对IB知之甚少)。

如何使用XIB 执行此操作?有人可以提供一个例子吗?

感谢您提供任何帮助。

5 个答案:

答案 0 :(得分:34)

我终于在发布后想出了这个。数据。 :)

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

  1. 删除现有的UITableViewController及其XIB。他们是垃圾。你真的很生气。

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

  3. 在IB中打开XIB并将标题内容和UITableView添加到UIView

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

  5. 在视图控制器的标头中,请务必添加<UITableViewDelegate, UITableViewDataSource>以实现这些协议

  6. 实施您熟悉和喜爱的所有常规UITableView委托和数据来源方法,但使用的是UIViewController,而不是您通过UITableViewController习惯的方式

  7. 此后事情应该有效。

答案 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(就定位而言)并编写你需要的任何布局而不会覆盖现有的表视图代码

编辑:

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

  1. 在界面构建器
  2. 中打开storyboar
  3. ViewController拖放新的Object Library元素到故事板以添加新控制器。
  4. 作为子视图,请从对象库中拖放Container View并将其放在ViewController

  5. 内的任何位置
  6. Container View创建了另一个视图控制器&#34; embedded&#34; segue作为一种联系。保存以删除此viewcontroller并将Container View与所需的view controller相关联(根据问题&lt; UITableViewController)

  7. 要将Container ViewUITableViewController连接,只需选择container view并按住+拖动到UITableViewController - 选择&#34;嵌入&#34;在弹出菜单中
  8. 现在,控制器将在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中添加为固定标题。