从父视图控制器再次推送时,子视图框架发生变化

Posted

技术标签:

【中文标题】从父视图控制器再次推送时,子视图框架发生变化【英文标题】:Child View frame change when pushed again from parent view controller 【发布时间】:2018-06-30 08:57:38 【问题描述】:

我在另一个视图控制器中添加了一个视图控制器的视图作为子视图。子视图控制器有一个表格视图。在单击didSelectRow 时,可以多次推送子视图控制器以在同一视图控制器中显示更新的数据,这工作正常。但是当我从父视图推送子视图控制器时,子视图将其框架更改为原始视图控制器框架并离开父视图。所以我想确保它始终保持在其父视图的框架中,并且推送和弹出只会发生在父视图内。

添加子视图:

 UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Home" bundle:nil];
    ChildViewController *vc = [sb instantiateViewControllerWithIdentifier:@"ChildViewController"];
    [self addChildViewController:vc];
    [vc.view setFrame:self.tableFilters.frame];
    [self.viewContainer addSubview:vc.view];
    [vc didMoveToParentViewController:self];

使用 Child viewcontroller 的 didSelctRow 方法编写的代码:

ChildViewController *newMyTableVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildViewController"];
   newMyTableVC.delegate = self;
   [self.tableView reloadData];
   [self.navigationController pushViewController:newMyTableVC animated:YES];

【问题讨论】:

你能展示一些你的设置截图吗?我对您将子视图添加到 viewContainer 但将其框架设置为 tableFilters 框架这一事实感到困惑。 ChildViewControllerUINavigationController 的子类吗? 不,它是 UIViewController 的子类 【参考方案1】:

由于您的子视图控制器未嵌入UINavigationController 的实例中,self.navigationController 指向其父级的导航控制器。这就是为什么在父视图控制器中进行推送和弹出的原因。

要在您的子视图控制器中进行推送和弹出工作,您必须将子视图控制器嵌入UINavigationController

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Home" bundle:nil];
ChildViewController *vc = [sb instantiateViewControllerWithIdentifier:@"ChildViewController"];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc];
[self addChildViewController:nc];
[nc.view setFrame:self.tableFilters.frame];
[self.viewContainer addSubview:nc.view];
[nc didMoveToParentViewController:self];

【讨论】:

我怎么会不去想这个。太棒了,一切都按目标 c 排序。

以上是关于从父视图控制器再次推送时,子视图框架发生变化的主要内容,如果未能解决你的问题,请参考以下文章

关闭当前视图控制器时 UIView 框架发生变化

如何在 swift 中从父视图访问容器视图子视图

Swift:添加子视图时视图的框架发生变化

发送数据时如何更新视图控制器而不是推送视图控制器?

Swift - 将数据从父视图控制器传递到子视图控制器

为啥当我在导航控制器中重置视图控制器的框架时啥也没发生