如何在当前的UITableViewController上添加一个UIView

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

这工作:

[self.view addSubview:self.progView]; 

但是你可以看到表格单元格线在UIView progView中stream血。

我试过这种方法:

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

这是试图将progView,UIView添加到当前视图上方的超级视图。 当我尝试这个,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出现,但似乎在桌子后面。

我尝试了上面的方法,但没有得到它的工作。 我也发现它需要太多的configuration和代码,因为它需要从头开始设置表格视图(在故事板内容易完成)。

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

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

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

这实际上是非常可能和简单 – 只需要一点点重新布线。 我遇到了一个类似的情况,编码这让我加载我的表视图的顶部加载屏幕。 这种方法也可以让你使用静态表格单元格和你自己的内容。

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

将这些实例variables添加到头文件中

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

Storyboard或XIB文件中:UITableViewController中的tableViewReference连接到tableViewReferencevariables。

然后在你的实现文件中

 // 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滚动表视图的内容。

注意:这个答案在被指出解决scheme包含边界矛盾代码后进行了编辑。 UITableViewController对它所持有的引用做了一些奇怪的事情。 一些更仔细的testing得出这个更简单的答案:)

我已经能够通过使用uiviewcontroller遏制在uitableviewcontroller顶部添加子视图。

UITableViewController实际上非常方便,当涉及到静态单元,这可能是唯一的时候,普遍的答案“只使用uitableview”可能实际上不可行。

所以我就是这么做的

  1. 给你的UITableViewController一个StoryBoard标识符,即MyStaticTableView
  2. 创build一个全新的UIViewController子类并将其称为UITableViewControllerContainer
  3. 将此控制器放置在故事板中的UITableViewController的位置
  4. 添加一个子视图到新的控制器,并将其链接到一个名为“ view_container
  5. 在你的UITableViewControllerContainer的 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

无论你添加到它将显示在你的表视图控制器上

您可以增加视图图层的zPosition。

这将使其显示在其他视图之上(默认情况下zPosition等于0)

 self.progView.layer.zPosition++; [self.view addSubview:self.progView]; 

问题是UITableViewControllerview属性和tableView属性是一样的。 这意味着根视图始终是一个表视图控制器,任何作为子视图添加的东西都将受到表视图function的约束。 这有其他不良的副作用,如你的子视图滚动时,你可能不希望他们。

这里有几个选项。 你可以覆盖loadView并安装你自己的视图和表格视图:

 // note: untested - (void)loadView { self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; self.view.backgroundColor = [UIColor whiteColor]; UITableView *tblView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain ]; tblView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ; self.tableView = tblView; [self.view addSubview:tblView]; [tblView release]; } 

然后,当你需要添加一个子视图时,根据需要添加它在self.tableView下方或上方。

另一个select是创build一个UIViewController子类,它UIViewController你的需求。 UITableViewController实际上不会添加太多,它实现的小function很容易被复制。 有文章喜欢重新创buildUITableViewController来增加代码重用 ,解释如何做到这一点很容易。

苹果示例“iPhoneCoreDataRecipes”正在使用一个NIB来加载一个头到一个UITableView。 看到这里 :

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

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

我有类似的问题,并得到解决使用下面的代码:

  [self.navigationController.view insertSubview:<subview> belowSubview:self.navigationController.navigationBar]; 

这使用堆栈中的控制器在正确的位置插入视图。

由于UITableViewController是UIViewController的子类,因此您需要将所需的视图添加到其超级视图中。

 Swift: self.view.superview?.addSubview(viewTobeAdded) Objective C: [self.view.superview addSubview: viewTobeAdded]; 

Swift解决scheme(相当于Daniel Saidi):

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

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

然后在你的实现文件中:

将这些实例variables添加到您的表视图控制器文件中:

 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连接到tableViewReferencevariables。

那么你将能够添加子视图如下:

 self.view.addSubView(someView) 

试试: [self.view bringSubviewToFront:self.progView];

或者你可以尝试添加self.progView到你的表的视图。

保持UIView UITableViewController中的表视图我使用一个(或多个)委托方法(UITableViewDelegate)。

 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) { ... } 

由于观点只能有一个接缝的超级观点,也是一个很好的解决scheme,纠正我,如果我错了。 仍然得到60fps所以这对我来说很好。

可能有理由不这样做,但这对我来说迄今为止。 如果你使用一个ap

viewDidLayoutSubviews里面你可以运行这个,但是一定要只运行一次

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

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

 -(void)viewDidLoad{ [super viewDidLoad]; //get the app delegate XYAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; //define the position of the rect based on the screen bounds CGRect loadingViewRect = CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2, 50, 50); //create the custom view. The custom view is a property of the VIewController self.loadingView = [[XYLoadingView alloc] initWithFrame:loadingViewRect]; //use the delegate's window object to add the custom view on top of the view controller [delegate.window addSubview: loadingView]; } 

尝试这样的事情:

 [self.tableView addSubview:overlayView]; overlayView.layer.zPosition = self.tableView.backgroundView.layer.zPosition + 1; 

你可以简单地把下面的代码放在viewDidAppear中:

 [self.tableView.superview addSubview:<your header view>]; 

iOS 11更新:

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

这个例子在UITableViewUITableViewController之上放置一个NavigationBar下面的视图

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