切换到 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];
}

这是否与我想要实现的目标相当?

设置子视图的框架正在触发一个新的布局。 NSLayoutConstraints 意味着不再有固定的层次结构来传播布局需求。

快速修复:

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