如何在当前UITableViewController上添加UIView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在当前UITableViewController上添加UIView相关的知识,希望对你有一定的参考价值。

我很难在UITableViewController的viewDidLoad方法中添加子视图(UIView)

这有效:

[self.view addSubview:self.progView];

但是你可以通过UIView progView看到表格单元格出血。

我尝试过这种方法:

[self.view.superview insertSubview:self.progView aboveSubview:self.view];

这是尝试将progView,UIView添加到当前视图上方的superview。当我尝试这个时,UIView永远不会出现。

- 更新 -

以下是最新的尝试:

UIView *myProgView = (UIView *)self.progView; //progView is a method that returns a UIView

[self.tableView insertSubview:myProgView aboveSubview:self.tableView]; 
[self.tableView bringSubviewToFront:myProgView];

结果与[self.view addSubview:self.progView]相同; UIView出现但似乎在桌子后面。

答案

我尝试了上面的方法,但没有让它工作。我还发现它需要太多的配置和代码,因为它需要从头开始设置表视图(这可以从故事板中轻松完成)。

相反,我在UITableViewController的UINavigationController视图中添加了我想在UITableView上面添加的视图,如下所示:

[self.navigationController.view addSubview:<view to add above the table view>];

这种方法要求您已将UITableViewController嵌入到UINavigationController中,但即使您不需要导航控制器,您仍然可以使用此方法并隐藏导航栏。

另一答案

我在桌子上面添加了一张图片。我用过这段代码:

self.tableView.tableHeaderView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]];
另一答案

swift解决方案(相当于Daniel Saidi):

如果您的控制器是Storyboard或XIB中的UITableViewController,并且您希望在保留现有表视图的同时将self.view重新分配给标准UIView:

@IBOutlet var tableViewReference: UITableView!
var viewReference: UIView!

然后在您的实现文件中:

将这些实例变量添加到表视图控制器文件中:

override var tableView: UITableView! {
    get { return tableViewReference }
    set { super.tableView = newValue }
}

override var view: UIView! {
    get { return viewReference }
    set { super.view = newValue }
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.edgesForExtendedLayout = UIRectEdge.None
    self.extendedLayoutIncludesOpaqueBars = false
    self.automaticallyAdjustsScrollViewInsets = false

    //rewiring views due to add tableView as subview to superview
    viewReference = UIView.init(frame: tableViewReference.frame)
    viewReference.backgroundColor = tableViewReference.backgroundColor
    viewReference.autoresizingMask = tableViewReference.autoresizingMask
    viewReference.addSubview(tableViewReference)
}

在Storyboard或XIB文件中:将UITableViewController中的tableView连接到tableViewReference变量。

然后,您将能够添加子视图,如下所示:

self.view.addSubView(someView)
另一答案

ios 11更新:

现在,当使用AutoLayout约束到安全区域时,可以将子视图添加到UITableView。这些视图不会沿TableView滚动。

这个例子在qazxsw poi的qazxsw poi顶部的导航栏下方放置了一个视图

UITableView
另一答案

您可以简单地将以下代码放在viewDidAppear中:

UITableViewController
另一答案

尝试:[self.tableView addSubview:self.topBarView]; [NSLayoutConstraint activateConstraints:@[ [self.topBarView.topAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.topAnchor], [self.topBarView.leadingAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.leadingAnchor], [self.topBarView.trailingAnchor constraintEqualToAnchor:self.tableView.safeAreaLayoutGuide.trailingAnchor], [self.topBarView.heightAnchor constraintEqualToConstant:40.0] ]];

或者您可以尝试将[self.tableView.superview addSubview:<your header view>]; 添加到表格视图中。

另一答案

为了将UIView保持在UITableViewController中的表视图之上,我使用了一个(或多个)委托方法(UITableViewDelegate)。

[self.view bringSubviewToFront:self.progView];

由于视图只能有一个看起来很好的超级视图,如果我错了,请纠正我。仍然得到60fps所以这对我来说没问题。

另一答案

斯威夫特4

这是我们重新构建视图层次结构的许多答案的最简化版本。这种方法不需要故事板/笔尖的额外插座,也可以使用编程构造的实例。

self.progView
另一答案

可能有理由不这样做,但到目前为止这对我有用。如果你使用ap

override func viewDidLoad() { super.viewDidLoad() self.tableView.addSubview(headerView) } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { tableView.addSubview(overlayView) // adds view always on top } // if using footers in table view tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) { ... } 里面你可以运行它,但确保只运行一次

class MyTableViewController: UITableViewController {

    var strongTableView: UITableView?

    override var tableView: UITableView! {
        get {
            return strongTableView ?? super.tableView
        }
        set {
            strongTableView = newValue
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // theoretically we could use self.tableView = self.tableView but compiler will not let us assign a property to itself
        self.tableView = self.view as? UITableView
        self.view = UIView(frame: self.tableView!.frame)
        self.view.addSubview(tableView)

    }

}
另一答案

我有一个类似的问题,我想在我的UITableViewController上添加一个加载指示器。为了解决这个问题,我将我的UIView添加为窗口的子视图。这解决了这个问题。这就是我做到的。

viewDidLayoutSubviews
另一答案

尝试这样的事情:

self.searchTableView = [[UITableView alloc] initWithFrame:self.tableView.frame style:UITableViewStylePlain];
self.searchTableView.backgroundColor = [UIColor purpleColor];
[self.view.superview addSubview:self.searchTableView];
另一答案

这实际上是非常可能和容易的 - 它只需要一些重新布线。我遇到了类似的情况,并将其编码为允许我在表格视图的顶部添加加载屏幕。此方法还允许您将静态表格单元格与您自己的内容一起使用。

如果您的控制器是Storyboard或XIB中的UITableViewController,并且您希望在保留现有表视图的同时将self.view重新分配给标准UIView:

将这些实例变量添加到头文件中:

IBOutlet UITableView *tableViewReference; // to keep a reference to the tableview
UIView *viewReference; // a reference to the new background view

在Storyboard或XIB文件中:将tableView中的UITableViewController连接到tableViewReference变量。

然后在您的实现文件中:

// Override the default accessors of the tableview and view
- (UITableView*)tableView { return tableViewReference; }
- (UIView*)view { return viewReference; }

- (void)viewDidLoad
{
    [super viewDidLoad];

    // instantiate the new self.view, similar to the tableview
    viewReference = [[UIView alloc] initWithFrame:tableViewReference.frame];
    [viewReference setBackgroundColor:tableViewReference.backgroundColor];
    viewReference.autoresizingMask = tableViewReference.autoresizingMask;
    // add it as a subview
    [viewReference addSubview:tableViewReference];

    /* remainder of viewDidLoad */

}

虽然看起来很奇怪,但UITableViewController在幕后引用很多古怪的东西。您需要等到viewDidLoad才能进行交换。在此之后,访问者将指向正确的UIViewUITableView

用法:喜欢的东西

    [self.view addSubview:myView];

将在表视图前面添加一个UIView myView,而不用myView滚动表视图的内容。

注意:在指出解决方案包含临界矛盾代码之后,对此答案进行了编辑。 UITableViewController对它所拥有的引用做了一些奇怪的事情。一些更仔细的测试得出这个更简单的答案:)

另一答案

我已经能够使用uiviewcontroller包含在uitableviewcontroller上添加子视图。

对于静态单元格而言,UITableViewController实际上非常方便,这可能是唯一一个“只使用uitableview”的常见答案实际上不可行的时候。

所以我就是这样做的。

  1. 给你的UITableViewController一个StoryBoard标识符,即MyStaticTableView
  2. 创建一个全新的UIViewController子类并将其命名为UITableViewControllerContainer
  3. 将此控制器放在故事板中的UITableViewController位置
  4. 将子视图添加到新控制器并将其链接到名为“view_container”的插座
  5. 在你UITableViewController容器viewDidLoad方法

添加代码如:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    UITableViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyStaticTableView"];
    [self addChildViewController:vc];
    [self.view_container addSubview:vc.view];
}

你可能遇到的问题:

  1. 如果你有额外的顶部空间,那么一定要将标志“想要全屏”添加到你的UITableViewController
  2. 如果它没有在你的UITableViewControllerContainer上正确调整大小

添加代码:

- (void)viewWillAppear:(BOOL)animated
{
    [[self.view_container.subviews lastObject] setFrame:self.view.frame];
}

此时,您可以从UITableViewController直接访问容器视图

self.view.superview.superview

无论你添加什么,它都将显示在你的表视图控制器上

另一答案

以上是关于如何在当前UITableViewController上添加UIView的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 中的仅横向 UIViewController

从 xib 调用 viewController

ReloadData (UITableView) 不起作用

表格视图不显示单元格中的内容

仅更改 UITableView 中一个部分的页脚大小

在 Swift Core Data 中从一对多关系中获取对象