在切换到xcode 6后,viewDidLayoutSubviews被无限调用

时间:2015-04-30 19:22:18

标签: ios cocoa-touch xcode6.3

我完美运行的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];
}

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

2 个答案:

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