切换到 xcode 6 后,viewDidLayoutSubviews 被无限调用
viewDidLayoutSubviews is getting called infinitely after switching to xcode 6
我的完美工作 iOS 应用程序在切换到 xcode 后停止正常工作 6. 我发现在我的一个视图控制器中 viewDidLayoutSubviews 方法被无限调用,直到内存级别达到某个应用程序因此而崩溃的时间点。
有人知道为什么会发生这种情况吗?我还注意到,在切换到 xcode 6 后,我的某些视图开始看起来很奇怪,但我在情节提要中修复了这些问题。
非常感谢任何形式的帮助!
编辑 1.
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.showsPlayerControls == NO) {
self.playerControlsView.hidden = YES;
CGRect graphFrame = self.view.bounds;
graphFrame.size.height = graphFrame.size.height - 20.0f;
graphFrame.origin.y = 20.0f;
self.graphView.frame = graphFrame;
}
[self.graphView reloadData];
}
编辑 2.
我的修复如下,基本上将我的代码移动到 viewWillAppear。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.showsPlayerControls == NO) {
self.playerControlsView.hidden = YES;
CGRect graphFrame = self.view.bounds;
graphFrame.size.height = graphFrame.size.height - 20.0f;
graphFrame.origin.y = 20.0f;
self.graphView.frame = graphFrame;
}
[self.graphView reloadData];
}
这是否与我想要实现的目标相当?
设置子视图的框架正在触发一个新的布局。 NSLayoutConstraint
s 意味着不再有固定的层次结构来传播布局需求。
快速修复:
if (!CGRectEqualToRect(self.graphView.frame, graphFrame))
self.graphView.frame = graphFrame;
如果reloadData
增加或减少子视图,它会产生同样的效果。如果您只是因为帧更改而重新加载数据,请仅在设置帧时执行此操作。如果您使用 viewDidLayoutSubviews
来推断除了子视图已布局之外的其他内容,请停止。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.showsPlayerControls == NO) {
self.playerControlsView.hidden = YES;
CGRect graphFrame = self.view.bounds;
graphFrame.size.height = graphFrame.size.height - 20.0f;
graphFrame.origin.y = 20.0f;
self.graphView.frame = graphFrame;
}
[self.graphView reloadData];
}
我遇到了同样的问题。当我将 UITableview 的 headerView 设置为当前更新的 headerView 时,viewDidLayoutStubviews 被无限调用。所以我强迫它设置 headerView 只用一个 Bool 变量发生一次。
var headerViewSet = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
commentsForRejected.numberOfLines = 0
commentsForRejected.text = "ABCDSAFMLDSFMWL W MELWFKMLWKFMLAWEKFM AWFMALWEFKMWELKFMLAWKF ANFOAWEFNAJWEFKNAEW AFNWKEFNKAWJFNEW"
self.headerView.frame = CGRect(x: 0,y: 0,width: headerView.frame.size.width, height: headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height)
if headerViewSet == false {
tableView.tableHeaderView = self.headerView
headerViewSet = true
}
}
我的完美工作 iOS 应用程序在切换到 xcode 后停止正常工作 6. 我发现在我的一个视图控制器中 viewDidLayoutSubviews 方法被无限调用,直到内存级别达到某个应用程序因此而崩溃的时间点。
有人知道为什么会发生这种情况吗?我还注意到,在切换到 xcode 6 后,我的某些视图开始看起来很奇怪,但我在情节提要中修复了这些问题。
非常感谢任何形式的帮助!
编辑 1.
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.showsPlayerControls == NO) {
self.playerControlsView.hidden = YES;
CGRect graphFrame = self.view.bounds;
graphFrame.size.height = graphFrame.size.height - 20.0f;
graphFrame.origin.y = 20.0f;
self.graphView.frame = graphFrame;
}
[self.graphView reloadData];
}
编辑 2.
我的修复如下,基本上将我的代码移动到 viewWillAppear。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.showsPlayerControls == NO) {
self.playerControlsView.hidden = YES;
CGRect graphFrame = self.view.bounds;
graphFrame.size.height = graphFrame.size.height - 20.0f;
graphFrame.origin.y = 20.0f;
self.graphView.frame = graphFrame;
}
[self.graphView reloadData];
}
这是否与我想要实现的目标相当?
设置子视图的框架正在触发一个新的布局。 NSLayoutConstraint
s 意味着不再有固定的层次结构来传播布局需求。
快速修复:
if (!CGRectEqualToRect(self.graphView.frame, graphFrame))
self.graphView.frame = graphFrame;
如果reloadData
增加或减少子视图,它会产生同样的效果。如果您只是因为帧更改而重新加载数据,请仅在设置帧时执行此操作。如果您使用 viewDidLayoutSubviews
来推断除了子视图已布局之外的其他内容,请停止。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.showsPlayerControls == NO) {
self.playerControlsView.hidden = YES;
CGRect graphFrame = self.view.bounds;
graphFrame.size.height = graphFrame.size.height - 20.0f;
graphFrame.origin.y = 20.0f;
self.graphView.frame = graphFrame;
}
[self.graphView reloadData];
}
我遇到了同样的问题。当我将 UITableview 的 headerView 设置为当前更新的 headerView 时,viewDidLayoutStubviews 被无限调用。所以我强迫它设置 headerView 只用一个 Bool 变量发生一次。
var headerViewSet = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
commentsForRejected.numberOfLines = 0
commentsForRejected.text = "ABCDSAFMLDSFMWL W MELWFKMLWKFMLAWEKFM AWFMALWEFKMWELKFMLAWKF ANFOAWEFNAJWEFKNAEW AFNWKEFNKAWJFNEW"
self.headerView.frame = CGRect(x: 0,y: 0,width: headerView.frame.size.width, height: headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height)
if headerViewSet == false {
tableView.tableHeaderView = self.headerView
headerViewSet = true
}
}