88
99#import " ASViewController.h"
1010#import " ASAssert.h"
11+ #import " ASAvailability.h"
1112#import " ASDimension.h"
1213#import " ASDisplayNodeInternal.h"
1314#import " ASDisplayNode+FrameworkPrivate.h"
@@ -55,12 +56,12 @@ - (instancetype)initWithNode:(ASDisplayNode *)node
5556
5657- (void )dealloc
5758{
58- if (_traitColectionContext != nil ) {
59+ if (_traitCollectionContext != nil ) {
5960 // The setter will iterate through the VC's subnodes and replace the traitCollectionContext in their ASEnvironmentTraitCollection with nil.
6061 // Since the VC holds the only strong reference to this context and we are in the process of destroying
6162 // the VC, all the references in the subnodes will be unsafe unless we nil them out. More than likely all the subnodes will be dealloc'ed
6263 // as part of the VC being dealloc'ed, but this is just to make extra sure.
63- self.traitColectionContext = nil ;
64+ self.traitCollectionContext = nil ;
6465 }
6566}
6667
@@ -82,6 +83,13 @@ - (void)loadView
8283 _node.frame = frame;
8384 _node.autoresizingMask = autoresizingMask;
8485 self.view = view;
86+
87+ // ensure that self.node has a valid trait collection before a subclass's implementation of viewDidLoad.
88+ // Any subnodes added in viewDidLoad will then inherit the proper environment.
89+ if (AS_AT_LEAST_IOS8) {
90+ ASEnvironmentTraitCollection traitCollection = [self environmentTraitCollectionForUITraitCollection: self .traitCollection];
91+ [self progagateNewEnvironmentTraitCollection: traitCollection];
92+ }
8593}
8694
8795- (void )viewWillLayoutSubviews
@@ -187,52 +195,53 @@ - (ASInterfaceState)interfaceState
187195
188196#pragma mark - ASEnvironmentTraitCollection
189197
190- - (void )setTraitColectionContext : (id )traitColectionContext
198+ - (void )setTraitCollectionContext : (id )traitCollectionContext
191199{
192- if (_traitColectionContext != traitColectionContext) {
193- // propagate first so that nodes aren't hanging around with a dealloc'ed pointer
194- ASEnvironmentTraitCollectionUpdateDisplayContext (self.node , traitColectionContext);
200+ if (_traitCollectionContext != traitCollectionContext) {
201+ // nil out the displayContext in the subnodes so they aren't hanging around with a dealloc'ed pointer don't set
202+ // the new context yet as this will cause ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection to fail
203+ ASEnvironmentTraitCollectionUpdateDisplayContext (self.node , nil );
195204
196- _traitColectionContext = traitColectionContext ;
205+ _traitCollectionContext = traitCollectionContext ;
197206 }
198207}
199208
200- - (ASEnvironmentTraitCollection)displayTraitsForTraitCollection : (UITraitCollection *)traitCollection
209+ - (ASEnvironmentTraitCollection)environmentTraitCollectionForUITraitCollection : (UITraitCollection *)traitCollection
201210{
202211 if (self.overrideDisplayTraitsWithTraitCollection ) {
203212 ASTraitCollection *asyncTraitCollection = self.overrideDisplayTraitsWithTraitCollection (traitCollection);
204- self.traitColectionContext = asyncTraitCollection.traitCollectionContext ;
213+ self.traitCollectionContext = asyncTraitCollection.traitCollectionContext ;
205214 return [asyncTraitCollection environmentTraitCollection ];
206215 }
207216
208217 ASEnvironmentTraitCollection asyncTraitCollection = ASEnvironmentTraitCollectionFromUITraitCollection (traitCollection);
209- asyncTraitCollection.displayContext = self.traitColectionContext ;
218+ asyncTraitCollection.displayContext = self.traitCollectionContext ;
210219 return asyncTraitCollection;
211220}
212221
213- - (ASEnvironmentTraitCollection)displayTraitsForWindowSize : (CGSize)windowSize
222+ - (ASEnvironmentTraitCollection)environmentTraitCollectionForWindowSize : (CGSize)windowSize
214223{
215224 if (self.overrideDisplayTraitsWithWindowSize ) {
216225 ASTraitCollection *traitCollection = self.overrideDisplayTraitsWithWindowSize (windowSize);
217- self.traitColectionContext = traitCollection.traitCollectionContext ;
226+ self.traitCollectionContext = traitCollection.traitCollectionContext ;
218227 return [traitCollection environmentTraitCollection ];
219228 }
220229 return self.node .environmentTraitCollection ;
221230}
222231
223- - (void )progagateNewDisplayTraits : (ASEnvironmentTraitCollection)traitCollection
232+ - (void )progagateNewEnvironmentTraitCollection : (ASEnvironmentTraitCollection)environmentTraitCollection
224233{
225234 ASEnvironmentState environmentState = self.node .environmentState ;
226- ASEnvironmentTraitCollection oldTraitCollection = environmentState.traitCollection ;
235+ ASEnvironmentTraitCollection oldEnvironmentTraitCollection = environmentState.environmentTraitCollection ;
227236
228- if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection (traitCollection, oldTraitCollection ) == NO ) {
229- environmentState.traitCollection = traitCollection ;
237+ if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection (environmentTraitCollection, oldEnvironmentTraitCollection ) == NO ) {
238+ environmentState.environmentTraitCollection = environmentTraitCollection ;
230239 self.node .environmentState = environmentState;
231240 [self .node setNeedsLayout ];
232241
233242 NSArray <id <ASEnvironment>> *children = [self .node children ];
234243 for (id <ASEnvironment> child in children) {
235- ASEnvironmentStatePropagateDown (child, environmentState.traitCollection );
244+ ASEnvironmentStatePropagateDown (child, environmentState.environmentTraitCollection );
236245 }
237246 }
238247}
@@ -241,24 +250,24 @@ - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
241250{
242251 [super traitCollectionDidChange: previousTraitCollection];
243252
244- ASEnvironmentTraitCollection traitCollection = [self displayTraitsForTraitCollection :self .traitCollection];
245- [self progagateNewDisplayTraits: traitCollection ];
253+ ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForUITraitCollection :self .traitCollection];
254+ [self progagateNewEnvironmentTraitCollection: environmentTraitCollection ];
246255}
247256
248257- (void )willTransitionToTraitCollection : (UITraitCollection *)newCollection withTransitionCoordinator : (id <UIViewControllerTransitionCoordinator>)coordinator
249258{
250259 [super willTransitionToTraitCollection: newCollection withTransitionCoordinator: coordinator];
251260
252- ASEnvironmentTraitCollection traitCollection = [self displayTraitsForTraitCollection : newCollection];
253- [self progagateNewDisplayTraits: traitCollection ];
261+ ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForUITraitCollection : newCollection];
262+ [self progagateNewEnvironmentTraitCollection: environmentTraitCollection ];
254263}
255264
256265- (void )viewWillTransitionToSize : (CGSize)size withTransitionCoordinator : (id <UIViewControllerTransitionCoordinator>)coordinator
257266{
258267 [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator];
259268
260- ASEnvironmentTraitCollection traitCollection = [self displayTraitsForWindowSize : size];
261- [self progagateNewDisplayTraits: traitCollection ];
269+ ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForWindowSize : size];
270+ [self progagateNewEnvironmentTraitCollection: environmentTraitCollection ];
262271}
263272
264273@end
0 commit comments