我的应用程序的视图包含4个用UIBezierPath制作的圆圈。
您可以点击某个圆圈以获取其中一个项目的详细信息
问题是,Circles在子视图中有一些约束,所以我无法在viewDidLoad方法中绘制它们(我试过但它是一团糟)所以整个绘图事情是在viewDidAppear方法中完成但是这使得每次出现视图时绘制的圆圈。
因此,如果我点击一个圆圈,那么我会在很长一段时间内回到圆圈视图:
我也尝试使用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)
}
答案 0 :(得分:2)
如果您希望此代码仅在视图出现时第一次执行,则只需添加一个表示“已初始化”的布尔变量。如果没有在viewDidAppear中运行代码,则将其设置为true。
答案 1 :(得分:1)
您可以在viewDidLayoutSubviews
中覆盖和添加用户界面自定义,super viewDidLayoutSubviews
之后绑定的子视图在屏幕上是正确的,并且每次出现该视图时都不会执行。
编辑:
无限循环的问题可能是您在setNeedsLayout
方法中调用createCircle
。我认为您应该重新考虑viewDidLayoutSubviews
和createCircle
逻辑,因为它应该是您想要的最佳流程。
答案 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)
}
}