@@ -40,6 +40,8 @@ public class Component<S>: Element {
40
40
/// Is the component a root?
41
41
private var root = false
42
42
43
+ private var parent : RealizedElement ?
44
+
43
45
private var frameChangedTrampoline = TargetActionTrampoline ( )
44
46
45
47
/// Initializes the component with its initial state. The render function
@@ -80,11 +82,10 @@ public class Component<S>: Element {
80
82
}
81
83
82
84
final private func realizeNewRoot( newRoot: Element ) {
83
- let realized = newRoot. realize ( )
85
+ let realized = newRoot. realize ( parent )
84
86
85
87
configureViewToAutoresize ( realized. view)
86
88
87
- realizedRoot? . view. removeFromSuperview ( )
88
89
realizedRoot = realized
89
90
}
90
91
@@ -93,7 +94,7 @@ public class Component<S>: Element {
93
94
newRoot. frame = frame
94
95
95
96
let node = newRoot. assembleLayoutNode ( )
96
- var layout : Layout !
97
+ let layout : Layout
97
98
if root {
98
99
layout = node. layout ( maxWidth: frame. size. width)
99
100
} else {
@@ -112,13 +113,8 @@ public class Component<S>: Element {
112
113
if newRoot. canDiff ( rootElement) {
113
114
newRoot. applyDiff ( rootElement, realizedSelf: realizedRoot)
114
115
} else {
115
- let superview = realizedRoot!. view. superview!
116
- rootElement. derealize ( )
117
-
116
+ realizedRoot? . remove ( )
118
117
realizeNewRoot ( newRoot)
119
- superview. addSubview ( realizedRoot!. view)
120
-
121
- newRoot. elementDidRealize ( realizedRoot!)
122
118
}
123
119
124
120
componentDidRender ( )
@@ -169,14 +165,12 @@ public class Component<S>: Element {
169
165
public func addToView( hostView: ViewType ) {
170
166
root = true
171
167
frame = hostView. bounds
172
- performInitialRenderIfNeeded ( )
173
- realizeRootIfNeeded ( )
174
- hostView. addSubview ( realizedRoot!. view)
175
- rootElement? . elementDidRealize ( realizedRoot!)
168
+ let parent = RealizedElement ( element: self , view: hostView, parent: nil )
169
+ realize ( parent)
176
170
177
171
#if os(OSX)
178
172
hostView. postsFrameChangedNotifications = true
179
- realizedRoot!. view. autoresizesSubviews = false
173
+ realizedRoot!. view? . autoresizesSubviews = false
180
174
181
175
frameChangedTrampoline. action = { [ weak self] in
182
176
if let strongSelf = self {
@@ -289,9 +283,9 @@ public class Component<S>: Element {
289
283
public override func applyDiff( old: Element , realizedSelf: RealizedElement ? ) {
290
284
super. applyDiff ( old, realizedSelf: realizedSelf)
291
285
292
- // Use `unsafeBitCast` instead of `as` to avoid a runtime crash.
293
- let oldComponent = unsafeBitCast ( old, Component . self)
286
+ let oldComponent = old as! Component
294
287
288
+ parent = oldComponent. parent
295
289
root = oldComponent. root
296
290
state = oldComponent. state
297
291
rootElement = oldComponent. rootElement
@@ -300,20 +294,22 @@ public class Component<S>: Element {
300
294
renderNewRoot ( )
301
295
}
302
296
303
- public override func realize( ) -> RealizedElement {
297
+ public override func realize( parent: RealizedElement ? ) -> RealizedElement {
298
+ self . parent = parent
299
+
304
300
performInitialRenderIfNeeded ( )
305
301
realizeRootIfNeeded ( )
306
- return RealizedElement ( element : self , view : realizedRoot! . view )
302
+ return super . realize ( parent )
307
303
}
308
304
309
305
public override func derealize( ) {
310
306
componentWillDerealize ( )
311
307
312
- rootElement? . derealize ( )
308
+ realizedRoot? . remove ( )
309
+ realizedRoot = nil
313
310
rootElement = nil
314
311
315
- realizedRoot? . view. removeFromSuperview ( )
316
- realizedRoot = nil
312
+ parent = nil
317
313
318
314
componentDidDerealize ( )
319
315
}
0 commit comments