我完美运行的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];
}
这是否与我想要实现的目标相当?
答案 0 :(得分:0)
设置子视图的框架会触发新的布局。 NSLayoutConstraint
意味着不再需要布局传播的固定层次结构。
快速修复:
if (!CGRectEqualToRect(self.graphView.frame, graphFrame))
self.graphView.frame = graphFrame;
如果reloadData
添加或减去子视图,它将具有相同的效果。如果您仅因帧更改而重新加载数据,请仅在设置帧时执行此操作。如果您使用viewDidLayoutSubviews
来推断除了子视图之外的其他内容,那么请停止。
答案 1 :(得分:0)
我遇到了同样的问题。当我将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
}
}