Ios UtableView的固定标题?

Ios UtableView的固定标题?,ios,uitableview,Ios,Uitableview,我有一个UITableView,我想在上面粘贴一个44px的子视图。我尝试了tableViewHeader,但它会与表的其余部分一起滚动 我尝试过搜索,发现很多人说我需要添加UIView superview,然后将标题和UITableView添加到其中。然而,我找不到一个具体如何做到这一点的例子。我尝试创建一个新的UIView子类,并在IB中布置子视图,但在让表控制器与UITable链接时遇到了麻烦(因为我对IB了解不够) 我如何使用XIBs实现这一点?有人能举个例子吗 谢谢你们能提供的帮助。我

我有一个
UITableView
,我想在上面粘贴一个44px的子视图。我尝试了
tableViewHeader
,但它会与表的其余部分一起滚动

我尝试过搜索,发现很多人说我需要添加UIView superview,然后将标题和UITableView添加到其中。然而,我找不到一个具体如何做到这一点的例子。我尝试创建一个新的UIView子类,并在IB中布置子视图,但在让表控制器与UITable链接时遇到了麻烦(因为我对IB了解不够)

我如何使用XIBs实现这一点?有人能举个例子吗


谢谢你们能提供的帮助。

我在发布后终于明白了这一点。数字:)

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

  • 删除现有的
    UITableViewController
    及其XIB。它们是垃圾。当你这样做的时候,你会非常生气

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

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

  • UITableView
    的IB插座中,确保将委托和数据源连接到文件所有者

  • 在视图控制器的标题中,确保添加
    以实现这些协议

  • 执行所有您熟悉和喜爱的常规
    UITableView
    委托和数据源方法,但使用
    UIViewController
    而不是习惯于通过
    UITableViewController


  • 在这之后,一切都会正常工作。

    问题是,UITableViewController的view属性与tableView属性是相同的。我也有同样的问题,想把一些固定的内容放在桌面上。我不想更改基类,因为它提供了许多我不想丢失或中断的强大功能

    修复其实很容易。诀窍是为self.tableView属性创建自定义集和get。然后,在loadView中,使用新的UIView替换视图,并将tableView添加到其中。然后,您可以在tableView周围自由添加子视图。这是如何做到的:

    在标题中:

    @interface CustomTableViewController : UITableViewController
    {
        UITableView *tableView;
    } 
    
    In.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);
    }
    

    享受吧

    作为一个选项,可以将UITableViewController作为UI的一部分嵌入另一个UIViewController,并使用“Container View”元素(从对象库(所有其他视图都在其中)的Interface Builder中选择一个)

    通过这种方式,您可以像普通视图一样使用UITableViewController(就定位而言),并在不覆盖现有表视图代码的情况下合成所需的任何布局

    编辑:

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

  • 在界面生成器中打开storyboar
  • 将新的
    ViewController
    元素从
    对象库
    拖放到情节提要中,以添加新的控制器
  • 作为子视图,从对象库中拖放
    容器视图
    ,并将其放置在
    视图控制器

  • 容器视图
    创建另一个视图控制器和“嵌入式”segue作为连接。保存后可删除此
    视图控制器
    ,并将
    容器视图
    连接到所需的
    视图控制器
    (根据问题,它是UITableViewController)

  • 要将
    容器视图
    UITableViewController
    连接,只需选择
    容器视图
    并控制+拖动到UITableViewController-在弹出菜单中选择“嵌入”
  • 现在,控制器将在
    容器视图中显示容器的位置和边界


    可以获取到Embeded view controller的链接-系统将启动主机viewcontroller(在上面的步骤1中创建)的“prepareForSegue”方法,并且控制器位于segue.destinationViewController属性中-可以根据需要对其进行自定义。只需确保在interface builder中为“embedded”segue设置一个标识符-这与任何其他segue的过程相同。

    将TableViewController替换为ViewController,在其中添加一个具有固定高度的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
    }
    

    查看此答案以添加自动刷新控件(如果需要)

    在脚本或xib中定义自定义UIView,在视图控制器中为该UIView创建IBOutlet引用。在
    -(void)视图中将出现:(BOOL)动画
    方法写入
    [self.tableView.superview addSubview:filterHeaderView]
    ,此处
    filterHeaderView
    是我的标题视图的IBOutlet参考,我想将其添加为我的tableview中的固定标题。

    这应该是可以接受的答案。覆盖现有方法(如当前接受的答案)应该是最后的手段。但是,如果出于其他原因需要将其作为UITableViewController,这并不能解决问题。@PauldeLange您是指Steve的答案吗?重写现有方法有什么问题?使用普通UIViewController的问题是,您失去了使用UIRefreshControl的能力,而UIRefreshControl仅受UITableViewController支持。关于重写现有方法,您怎么说=您建议这样做吗?即使这样做有效,但在技术上是错误的,由于文档明确表示不要在loadView中调用
    super
    (此解决方案需要执行此操作)。如果您认为此问题重复,则应将其标记为重复问题。不要将其他StackOverflow帖子的链接作为答案。这个问题没有重复,上面有人说原因之一是没有