2011-01-09 74 views
46

我很难从一个UITableViewController的viewDidLoad方法中如何添加当前的UITableViewController上面一个UIView

这个工程添加子视图(UIView的):

[self.view addSubview:self.progView]; 

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

我试过这种方法:

[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出现,但似乎在桌子后面。

+2

UITableView的顶部,你是否尝试过使用`aboveSubview:self.view`?我不是说它会解决你的问题,但它听起来像会摆脱你所得到的错误信息。 – 2011-01-09 21:25:32

+0

是的,我确实尝试过。诚然,我失去了警告,但它仍然不呈现视图。我会编辑我的帖子。 – user558096 2011-01-10 00:48:33

+0

一个简单的方法是设置progVIew的框架,我相信哪个可以工作。任何约束都不起作用,包括VFL – BollMose 2015-05-28 07:54:30

回答

1

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

或者你可以尝试添加self.progView你的表的观点。

+0

[self.view bringSubViewToFront:self.progView];给我的警告:'UIView'可能不会响应'-bringSubViewToFront:'并使用“无法识别的选择器发送到实例”异常来崩溃应用程序。 – user558096 2011-01-10 01:02:09

+0

那么你的控制器是一个UITableViewController? – WrightsCS 2011-01-10 01:24:08

+0

是的,我的控制器是一个UITableViewController。 – user558096 2011-01-10 01:30:11

6

问题是UITableViewControllerview属性与tableView属性相同。这意味着根视图是总是一个表视图控制器,作为子视图添加的任何东西都将受到表视图功能的支配。这还有其他不良的副作用,比如你的子视图在你不想要的时候滚动。

这里有几个选项。您可以覆盖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

另一种选择是创建一个UIViewController子类,它可以满足您的需求。 UITableViewController坦率地说不会增加太多,并且它实现的小功能很容易被复制。有像Recreating UITableViewController to increase code reuse这样的文章可以很容易地解释如何做到这一点。

+0

感谢您的帮助。不幸的是,我真的很努力使你的第一个建议工作。也许我想要做的只是不可能的。在这一点上,我试图让UIView成为自我。UITableViewController子类的视图。然后使UITableView成为UIView的子视图。它似乎不可能做到这一点,我真的需要根据您的第二个建议将我的UITableViewController转换为UIViewController。任何想法或指向教程或示例代码可能会有所帮助。提前致谢。 – user558096 2011-01-13 17:26:38

+1

我不会引用self.view在loadView中读取,最终会以无限循环结束。只分配给它。 – Diziet 2011-07-25 17:07:21

5

Apple示例“iPhoneCoreDataRecipes”使用NIB将标题加载到UITableView。 请参阅here

+0

我同意这个答案! – Jagie 2017-04-11 14:50:00

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]; 
} 

问题,你可能有:

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

添加代码:

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

从您的UITableViewController这一点,你可以用

self.view.superview.superview

,无论您添加直接访问你的容器视图它会显示在你的桌面视图控制器上面

87

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

相反,我还说,我想补充我上面的UITableView到的UITableViewController的的UINavigationController的观点来看,这样:

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

这种方法需要您已经嵌入在一个UINavigationController的的UITableViewController,但即使你不想要一个导航控制器,你仍然可以使用这种方法并隐藏导航栏。

28

这实际上是非常可能和简单 - 它只需要一点点重新布线。我遇到了类似的情况,并对其进行了编码,以允许我在桌面视图顶部添加加载屏幕。这种方法还允许您将静态表格单元格用于您自己的内容。

如果您的控制器是故事板或XIB中的UITableViewController,并且您希望重新指定自我。以一个标准的UIView,同时保留现有的表视图:

添加这些实例变量您头文件

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

在你故事板或XIB文件:UITableViewController连接tableView到变量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对它所持有的引用做了一些奇怪的事情。一些更仔细的测试得出这个更简单的答案:)

4

我在表格上方添加了一个图像。我用这个代码:

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

我有一个类似的问题,我想在我的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]; 
} 
0

有可能是有理由不这样做,但这对我来说迄今为止。如果您使用的AP

里面viewDidLayoutSubviews你可以运行它,但请务必只运行一次明显

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

您可以增加您的视图层的z位置。

这将使上面显示的其他视图(其中有等于0的z位置,默认情况下)

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

尝试这样的事:

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

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

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

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

2

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

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

Objective C: 
[self.view.superview addSubview: viewTobeAdded]; 
0

您可以简单地把下面的代码在viewDidAppear:

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

解决方案迅速(相当于丹尼尔·赛义迪):

如果控制器是在故事板或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) 
} 

在你的故事板或XIB文件:在的UITableViewController连接的tableView到tableViewReference变量。

然后你就可以添加子发表意见如下:

self.view.addSubView(someView) 
1

为了保持上述的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) { ... } 

由于意见只能有一个超级查看接缝也是很好的解决方案,纠正我,如果我错了。仍然获得60fps,所以对我来说很好。

0

更新为iOS 11:

现在可以使用自动版式限制到安全区时,一个子视图添加到UITableView。这些视图不会沿着TableView滚动。

这个例子会将导航栏下方的视图上的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] 
]]; 
相关问题