2016-02-27 51 views
1

因此,这是一种奇怪的一个,我不太明白是怎么回事...意外类嵌套 - 代码运行10过于频繁(SWIFT)

所以我做了一些自定义在彼此类/对象(UIViews)是这样的:

class Example1: UIView { 
    [properties etc.] 

let Test = Example2() 
Test.frame = CGRe... 
addSubview(Test) 
} 


class Example2: UIView { 
    [properties etc.] 
} 

,直到你添加某种有趣的这一切工作正常参见Example2。然后,它会多次运行一切(如果您调用Example1,Example2 = 1,2,它将按以下顺序运行:1,1,2,2,1,2,1,2,2,2)。

这样做的问题是,它会创建同一对象的多个版本,但具有不同的值,因为它们是在其他位置(大小和位置等)计算的。

我希望我能够解释我这样的问题,否则是整个(相当凌乱,因为我一直在试图解决这个问题)代码:http://pastebin.com/4D3kt1uN(如果你像你可以尝试运行它在xcode中查看我的意思)。

任何帮助,非常感谢!

+0

问题是你的代码是在'layoutSubviews'中,它可以(通常会)被多次调用。每次,您的代码都会创建并添加新的子视图(其中每个子视图都会接收到'layoutSubviews'调用)。您应该**在课程的初始者中创建**子视图; 'layoutSubviews'应该确保它们位于正确的位置。 – pbasdf

+0

@pbasdf这解决了它运行多次的问题,但我应该用什么作为初始化/构造函数?我已经尝试了所需的init编码器和框架,但是它只会执行第一个类(或者没有)... – Mats

+0

例如,如果有'let monday = RoosterViewMonday()','init()'方法是称为(不是'init(frame:)'或'init(coder:)')。修改为使用'let monday = RoosterViewMonday(frame:....)'或实现'init()'。同样的其他鸡...意见。 – pbasdf

回答

0

您的代码存在的问题是,您在layoutSubviews方法中添加子视图。

override func layoutSubviews() { 
    ... 
    let GuideLine = UIView() 
    addSubview(GuideLine) 
    ... 
} 

layoutSubviews方法可以在应用程序的生命周期中多次调用。例如,参见这个SO问题“When is layoutSubviews called?”。 因此,每当布局更改时,您的子视图都会添加到屏幕中。这就是为什么你看到你的意见的多个版本。 尝试将您的逻辑移出layoutSubviews方法。

+0

这解决了它运行多次的问题,但我应该用什么作为初始化/构造函数?我试过了所需的init编码器和框架,但它只会执行第一个类(或没有)... – Mats