仅在首次显示视图时才在viewDidAppear中执行操作

时间:2016-06-14 09:09:48

标签: ios xcode swift

我的应用程序的视图包含4个用UIBezierPath制作的圆圈。

view with circles

您可以点击某个圆圈以获取其中一个项目的详细信息

view with details

问题是,Circles在子视图中有一些约束,所以我无法在viewDidLoad方法中绘制它们(我试过但它是一团糟)所以整个绘图事情是在viewDidAppear方法中完成但是这使得每次出现视图时绘制的圆圈。

因此,如果我点击一个圆圈,那么我会在很长一段时间内回到圆圈视图:

view with circles after I went to check the details a lot for any circle

我也尝试使用viewDidLayoutSubviews方法,但是我得到了一个无限循环。所以我问是否有人有想法处理这个问题。 (用最干净的方式)

这就是我的viewDidAppear的样子:

override func viewDidAppear(animated: Bool) {
        createCircle(firstCircle, text: "Breathe", color: blue, directionForAdjustment: 1, identifier: 0)
        createCircle(secondCircle, text: "Cocoon", color: green, directionForAdjustment: 1, identifier: 1)
        createCircle(thirdCircle, text: "Smokeless", color: cyan, directionForAdjustment: -1, identifier: 2)
        createCircle(fourthCircle, text: "Sleep", color: purple, directionForAdjustment: -1, identifier: 3)
}

3 个答案:

答案 0 :(得分:2)

如果您希望此代码仅在视图出现时第一次执行,则只需添加一个表示“已初始化”的布尔变量。如果没有在viewDidAppear中运行代码,则将其设置为true。

答案 1 :(得分:1)

您可以在viewDidLayoutSubviews中覆盖和添加用户界面自定义,super viewDidLayoutSubviews之后绑定的子视图在屏幕上是正确的,并且每次出现该视图时都不会执行。

编辑: 无限循环的问题可能是您在setNeedsLayout方法中调用createCircle。我认为您应该重新考虑viewDidLayoutSubviewscreateCircle逻辑,因为它应该是您想要的最佳流程。

答案 2 :(得分:1)

您还可以使用dispatch_once

class YourClass: UIViewController {
    static var once: dispatch_once_t = 0

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        _dispatch_once(&YourClass.once) {
            self.viewDidAppearFirstTime()
        }    
    }

    func viewDidAppearFirstTime() {
         createCircle(firstCircle, text: "Breathe", color: blue, directionForAdjustment: 1, identifier: 0)
         createCircle(secondCircle, text: "Cocoon", color: green, directionForAdjustment: 1, identifier: 1)
         createCircle(thirdCircle, text: "Smokeless", color: cyan, directionForAdjustment: -1, identifier: 2)
         createCircle(fourthCircle, text: "Sleep", color: purple, directionForAdjustment: -1, identifier: 3)
    }
}