如何在当前UITableViewController上添加UIView

use*_*096 56 iphone objective-c ios4

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

这有效:

[self.view addSubview:self.progView];
Run Code Online (Sandbox Code Playgroud)

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

我尝试过这种方法:

[self.view.superview insertSubview:self.progView aboveSubview:self.view];
Run Code Online (Sandbox Code Playgroud)

这是尝试将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];
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*idi 93

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

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

[self.navigationController.view addSubview:<view to add above the table view>];
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以这样做:`[self.navigationController.view insertSubview:holderView belowSubview:self.navigationController.navigationBar];` (37认同)
  • 您的解决方案的问题是,当您执行此操作时,视图也会添加到导航栏上 (9认同)
  • 随着时间的推移,我开始放弃使用表视图控制器,除非视图应该只是一个列表而你想强制执行.如果您改为将表视图添加到常规视图控制器并设置数据源并自行委派,则可以获得更灵活的设置,其中tableview只是主视图中的另一个视图,而不是主视图本身.这将使您免于表视图控制器的许多内置限制. (4认同)
  • 另一个问题是添加的视图仍然位于UINavigationController之上,即使在推送新的UIViewController之后也是如此. (3认同)

Tho*_*eek 28

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

如果您的控制器是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
Run Code Online (Sandbox Code Playgroud)

Storyboard或XIB文件中:tableViewin 连接UITableViewControllertableViewReference变量.

然后在您的实现文件中:

// 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 */

}
Run Code Online (Sandbox Code Playgroud)

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

用法:喜欢的东西

    [self.view addSubview:myView];
Run Code Online (Sandbox Code Playgroud)

myView在表视图前添加UIView ,而不myView滚动表视图的内容.

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

  • 优秀作品。下次见到你时提醒我给你买啤酒,托马斯 (2认同)

Nic*_*zzi 11

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

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

所以我就是这样做的.

  1. 给你的UITableViewController一个StoryBoard标识符,即MyStaticTableView
  2. 创建一个全新的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];
}
Run Code Online (Sandbox Code Playgroud)

你可能遇到的问题:

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

添加代码:

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

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

self.view.superview.superview

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


小智 11

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

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

self.progView.layer.zPosition++;
[self.view addSubview:self.progView];
Run Code Online (Sandbox Code Playgroud)


Nik*_*Kov 10

斯威夫特2018

这是我使用分镜脚本的方式:

1)在情节提要中添加一个视图。
在此处输入图片说明

2)链接到UITableViewController类:

@IBOutlet weak var copyrightLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)

3)将其添加到代码中

self.navigationController?.view.addSubview(copyrightView)
copyrightView.frame = CGRect(x: 0,
                            y: self.view.bounds.size.height - copyrightView.bounds.size.height,
                            width: self.view.bounds.size.width,
                            height: copyrightView.bounds.size.height)
Run Code Online (Sandbox Code Playgroud)

4)瞧!
在此处输入图片说明

该视图将不会与表格视图一起滚动。从情节提要中可以轻松进行设计。

注意: 此解决方案将子视图添加到导航控制器,并且如果您要从此处导航至另一个屏幕,您将发现该子视图保持不变,请在执行segue时使用viewDidDisappear上的copyrightView.removeFromSuperView将其删除。


Sai*_*n K 7

由于UITableViewController是UIViewController的子类,因此您需要将所需的视图添加到其superview.

Swift:
self.view.superview?.addSubview(viewTobeAdded)

Objective C:
[self.view.superview addSubview: viewTobeAdded];
Run Code Online (Sandbox Code Playgroud)

  • @Jovan:是的,但是我仍然认为Saikiran的答案极简主义很棒。在viewDidAppear或viewDidLayoutSubviews中,self.view.superview不为零。有趣的是,当您在控制台中打印出self.view.superview时,它会打印:&lt;UIViewControllerWrapperView:0x157b03d70; 框架=(0 0; 375812); 自动调整大小= W + H; 层= &lt;CALayer:0x2834445c0 &gt;&gt;。这个UIViewControllerWrapperView名称很有意义。 (3认同)

Jus*_*ers 6

问题是view属性UITableViewControllertableView属性相同.这意味着根视图始终是一个表视图控制器,任何作为子视图添加的内容都将受到表视图功能的限制.这有其他不良副作用,例如您可能不希望它们滚动的子视图.

这里有几个选项.您可以覆盖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];
}
Run Code Online (Sandbox Code Playgroud)

然后,当您需要添加子视图时,请根据需要在其下方或上方添加self.tableView.

另一个选择就是创建一个UIViewController可以满足您需求的子类.UITableViewController说实话,这并没有增加太多,而且它实现的功能很少,很容易被复制.有一些文章,如Recreating UITableViewController,以增加代码重用,解释如何轻松地执行此操作.


Jay*_*bey 6

我有类似的问题,并使用以下代码解决了:

     [self.navigationController.view insertSubview:<subview> 
       belowSubview:self.navigationController.navigationBar];
Run Code Online (Sandbox Code Playgroud)

这将使用Stack中存在的控制器将视图插入正确的位置。


Ola*_*laf 5

Apple示例"iPhoneCoreDataRecipes"正在使用NIB将标头加载到UITableView上.看到这里:


Wri*_*sCS 1

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

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