2016-02-27 3 views
1

Так что это своего рода странный друг, и я не совсем понимаю, что происходит ...Непреднамеренное класс вложенности - код работает 10 слишком часто (Swift)

Так что я сделал несколько пользовательских классы/объекты (UIViews) друг в друга, как это:

class Example1: UIView { 
    [properties etc.] 

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


class Example2: UIView { 
    [properties etc.] 
} 

Это все работает отлично, пока вы не добавите какое-то удовольствие к примеру2. Затем он будет запускать все несколько раз (если вы выберете 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-кодер и фрейм, но тогда он выполнит только первый класс (или none) ... – Mats

+0

Если у вас есть, например, 'let monday = RoosterViewMonday()', то метод '' init() ' (не 'init (frame:)' или 'init (coder:)'). Либо изменить использовать 'let monday = RoosterViewMonday (frame: ....)' или реализовать 'init()'. Аналогично для другого петуха ... просмотров. – pbasdf

ответ

0

Проблема с вашим кодом заключается в том, что вы добавляете subview в метод layoutSubviews.

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

layoutSubviews метод можно назвать много раз в течение жизни приложения. См., Например, этот вопрос SO «When is layoutSubviews called?». В результате ваши подзаголовки добавляются на экран каждый раз при изменении макета. Вот почему вы видите несколько версий своих просмотров. Попробуйте переместить свою логику из метода layoutSubviews.

+0

Это исправляет проблему с запуском несколько раз, но что я должен использовать в качестве инициализатора/конструктора? Я пробовал необходимый init-кодер и фрейм, но тогда он выполнит только первый класс (или none) ... – Mats

Смежные вопросы