Procházet zdrojové kódy

Fix topBar options merging with default (#5918)

Yogev Ben David před 4 roky
rodič
revize
5d07befa39

+ 113
- 113
lib/ios/RNNStackPresenter.m Zobrazit soubor

@@ -7,9 +7,9 @@
7 7
 #import "InteractivePopGestureDelegate.h"
8 8
 
9 9
 @interface RNNStackPresenter() {
10
-	RNNReactComponentRegistry* _componentRegistry;
11
-	UIView* _customTopBarBackground;
12
-	RNNReactView* _topBarBackgroundReactView;
10
+    RNNReactComponentRegistry* _componentRegistry;
11
+    UIView* _customTopBarBackground;
12
+    RNNReactView* _topBarBackgroundReactView;
13 13
     TopBarPresenter* _topBarPresenter;
14 14
     InteractivePopGestureDelegate *_interactivePopGestureDelegate;
15 15
 }
@@ -20,10 +20,10 @@
20 20
 @implementation RNNStackPresenter
21 21
 
22 22
 - (instancetype)initWithComponentRegistry:(RNNReactComponentRegistry *)componentRegistry defaultOptions:(RNNNavigationOptions *)defaultOptions {
23
-	self = [super initWithDefaultOptions:defaultOptions];
24
-	_componentRegistry = componentRegistry;
23
+    self = [super initWithDefaultOptions:defaultOptions];
24
+    _componentRegistry = componentRegistry;
25 25
     _interactivePopGestureDelegate = [InteractivePopGestureDelegate new];
26
-	return self;
26
+    return self;
27 27
 }
28 28
 
29 29
 - (void)bindViewController:(UINavigationController *)boundViewController {
@@ -46,149 +46,149 @@
46 46
 }
47 47
 
48 48
 - (void)applyOptions:(RNNNavigationOptions *)options {
49
-	[super applyOptions:options];
50
-	RNNStackController* stack = self.stackController;
51
-	RNNNavigationOptions * withDefault = [options withDefault:[self defaultOptions]];
52
-	
49
+    [super applyOptions:options];
50
+    RNNStackController* stack = self.stackController;
51
+    RNNNavigationOptions * withDefault = [options withDefault:[self defaultOptions]];
52
+    
53 53
     [_interactivePopGestureDelegate setEnabled:[withDefault.popGesture getWithDefaultValue:YES]];
54
-	stack.interactivePopGestureRecognizer.delegate = _interactivePopGestureDelegate;
54
+    stack.interactivePopGestureRecognizer.delegate = _interactivePopGestureDelegate;
55 55
 
56 56
     [stack setBarStyle:[RCTConvert UIBarStyle:[withDefault.topBar.barStyle getWithDefaultValue:@"default"]]];
57
-	[stack setRootBackgroundImage:[withDefault.rootBackgroundImage getWithDefaultValue:nil]];
58
-	[stack setNavigationBarTestId:[withDefault.topBar.testID getWithDefaultValue:nil]];
59
-	[stack setNavigationBarVisible:[withDefault.topBar.visible getWithDefaultValue:YES] animated:[withDefault.topBar.animate getWithDefaultValue:YES]];
60
-	[stack hideBarsOnScroll:[withDefault.topBar.hideOnScroll getWithDefaultValue:NO]];
57
+    [stack setRootBackgroundImage:[withDefault.rootBackgroundImage getWithDefaultValue:nil]];
58
+    [stack setNavigationBarTestId:[withDefault.topBar.testID getWithDefaultValue:nil]];
59
+    [stack setNavigationBarVisible:[withDefault.topBar.visible getWithDefaultValue:YES] animated:[withDefault.topBar.animate getWithDefaultValue:YES]];
60
+    [stack hideBarsOnScroll:[withDefault.topBar.hideOnScroll getWithDefaultValue:NO]];
61 61
     
62 62
     [_topBarPresenter applyOptions:withDefault.topBar];
63 63
     
64 64
     [stack setNavigationBarBlur:[withDefault.topBar.background.blur getWithDefaultValue:NO]];
65 65
     [stack setNavigationBarLargeTitleVisible:[withDefault.topBar.largeTitle.visible getWithDefaultValue:NO]];
66
-	[stack setNavigationBarClipsToBounds:[withDefault.topBar.background.clipToBounds getWithDefaultValue:NO]];
67
-	[stack setBackButtonColor:[withDefault.topBar.backButton.color getWithDefaultValue:nil]];
66
+    [stack setNavigationBarClipsToBounds:[withDefault.topBar.background.clipToBounds getWithDefaultValue:NO]];
67
+    [stack setBackButtonColor:[withDefault.topBar.backButton.color getWithDefaultValue:nil]];
68 68
 }
69 69
 
70 70
 - (void)applyOptionsOnViewDidLayoutSubviews:(RNNNavigationOptions *)options {
71
-	RNNNavigationOptions *withDefault = [options withDefault:[self defaultOptions]];
72
-	if (withDefault.topBar.background.component.name.hasValue) {
73
-		[self presentBackgroundComponent];
74
-	}
71
+    RNNNavigationOptions *withDefault = [options withDefault:[self defaultOptions]];
72
+    if (withDefault.topBar.background.component.name.hasValue) {
73
+        [self presentBackgroundComponent];
74
+    }
75 75
 }
76 76
 
77 77
 - (void)applyOptionsBeforePopping:(RNNNavigationOptions *)options {
78
-	RNNNavigationOptions *withDefault = [options withDefault:[self defaultOptions]];
79
-	RNNStackController* navigationController = self.stackController;
80
-	[navigationController setNavigationBarLargeTitleVisible:[withDefault.topBar.largeTitle.visible getWithDefaultValue:NO]];
78
+    RNNNavigationOptions *withDefault = [options withDefault:[self defaultOptions]];
79
+    RNNStackController* navigationController = self.stackController;
80
+    [navigationController setNavigationBarLargeTitleVisible:[withDefault.topBar.largeTitle.visible getWithDefaultValue:NO]];
81 81
     [_topBarPresenter applyOptionsBeforePopping:options.topBar];
82 82
 }
83 83
 
84 84
 - (void)mergeOptions:(RNNNavigationOptions *)options resolvedOptions:(RNNNavigationOptions *)resolvedOptions {
85 85
     [super mergeOptions:options resolvedOptions:resolvedOptions];
86
-	RNNStackController* stack = self.stackController;
87
-    
88
-	if (options.popGesture.hasValue) {
89
-		[_interactivePopGestureDelegate setEnabled:options.popGesture.get];
90
-	}
91
-	
92
-	if (options.rootBackgroundImage.hasValue) {
93
-		[stack setRootBackgroundImage:options.rootBackgroundImage.get];
94
-	}
95
-	
96
-	if (options.topBar.testID.hasValue) {
97
-		[stack setNavigationBarTestId:options.topBar.testID.get];
98
-	}
99
-	
100
-	if (options.topBar.visible.hasValue) {
101
-		[stack setNavigationBarVisible:options.topBar.visible.get animated:[options.topBar.animate getWithDefaultValue:YES]];
102
-	}
103
-	
104
-	if (options.topBar.hideOnScroll.hasValue) {
105
-		[stack hideBarsOnScroll:[options.topBar.hideOnScroll get]];
106
-	}
107
-	
108
-	if (options.topBar.barStyle.hasValue) {
109
-		[stack setBarStyle:[RCTConvert UIBarStyle:options.topBar.barStyle.get]];
110
-	}
111
-	
112
-	if (options.topBar.background.clipToBounds.hasValue) {
113
-		[stack setNavigationBarClipsToBounds:[options.topBar.background.clipToBounds get]];
114
-	}
115
-	
116
-	if (options.topBar.background.blur.hasValue) {
117
-		[stack setNavigationBarBlur:[options.topBar.background.blur get]];
118
-	}
119
-	
120
-	if (options.topBar.largeTitle.visible.hasValue) {
121
-		[stack setNavigationBarLargeTitleVisible:options.topBar.largeTitle.visible.get];
122
-	}
123
-	
124
-	if (options.topBar.backButton.color.hasValue) {
125
-		[stack setBackButtonColor:options.topBar.backButton.color.get];
126
-	}
127
-
128
-	if (options.topBar.background.component.name.hasValue) {
129
-		[self setCustomNavigationComponentBackground:options perform:nil];
130
-	}
86
+    RNNStackController* stack = self.stackController;
87
+    
88
+    if (options.popGesture.hasValue) {
89
+        [_interactivePopGestureDelegate setEnabled:options.popGesture.get];
90
+    }
91
+    
92
+    if (options.rootBackgroundImage.hasValue) {
93
+        [stack setRootBackgroundImage:options.rootBackgroundImage.get];
94
+    }
95
+    
96
+    if (options.topBar.testID.hasValue) {
97
+        [stack setNavigationBarTestId:options.topBar.testID.get];
98
+    }
99
+    
100
+    if (options.topBar.visible.hasValue) {
101
+        [stack setNavigationBarVisible:options.topBar.visible.get animated:[options.topBar.animate getWithDefaultValue:YES]];
102
+    }
103
+    
104
+    if (options.topBar.hideOnScroll.hasValue) {
105
+        [stack hideBarsOnScroll:[options.topBar.hideOnScroll get]];
106
+    }
107
+    
108
+    if (options.topBar.barStyle.hasValue) {
109
+        [stack setBarStyle:[RCTConvert UIBarStyle:options.topBar.barStyle.get]];
110
+    }
111
+    
112
+    if (options.topBar.background.clipToBounds.hasValue) {
113
+        [stack setNavigationBarClipsToBounds:[options.topBar.background.clipToBounds get]];
114
+    }
115
+    
116
+    if (options.topBar.background.blur.hasValue) {
117
+        [stack setNavigationBarBlur:[options.topBar.background.blur get]];
118
+    }
119
+    
120
+    if (options.topBar.largeTitle.visible.hasValue) {
121
+        [stack setNavigationBarLargeTitleVisible:options.topBar.largeTitle.visible.get];
122
+    }
123
+    
124
+    if (options.topBar.backButton.color.hasValue) {
125
+        [stack setBackButtonColor:options.topBar.backButton.color.get];
126
+    }
127
+
128
+    if (options.topBar.background.component.name.hasValue) {
129
+        [self setCustomNavigationComponentBackground:options perform:nil];
130
+    }
131 131
     
132 132
     RNNNavigationOptions * withDefault = (RNNNavigationOptions *) [[options mergeInOptions:resolvedOptions] withDefault:[self defaultOptions]];
133
-    [_topBarPresenter mergeOptions:options.topBar defaultOptions:withDefault.topBar];
133
+    [_topBarPresenter mergeOptions:options.topBar withDefault:withDefault.topBar];
134 134
 }
135 135
 
136 136
 - (void)renderComponents:(RNNNavigationOptions *)options perform:(RNNReactViewReadyCompletionBlock)readyBlock {
137
-	dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
138
-		dispatch_group_t group = dispatch_group_create();
139
-		
140
-		dispatch_group_enter(group);
141
-		dispatch_async(dispatch_get_main_queue(), ^{
142
-			[self setCustomNavigationComponentBackground:options perform:^{
143
-				dispatch_group_leave(group);
144
-			}];
145
-		});
146
-		
147
-		dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
148
-		
149
-		dispatch_async(dispatch_get_main_queue(), ^{
150
-			if (readyBlock) {
151
-				readyBlock();
152
-			}
153
-		});
154
-	});
137
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
138
+        dispatch_group_t group = dispatch_group_create();
139
+        
140
+        dispatch_group_enter(group);
141
+        dispatch_async(dispatch_get_main_queue(), ^{
142
+            [self setCustomNavigationComponentBackground:options perform:^{
143
+                dispatch_group_leave(group);
144
+            }];
145
+        });
146
+        
147
+        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
148
+        
149
+        dispatch_async(dispatch_get_main_queue(), ^{
150
+            if (readyBlock) {
151
+                readyBlock();
152
+            }
153
+        });
154
+    });
155 155
 }
156 156
 
157 157
 - (void)setCustomNavigationComponentBackground:(RNNNavigationOptions *)options perform:(RNNReactViewReadyCompletionBlock)readyBlock {
158 158
     RNNNavigationOptions *withDefault = [options withDefault:[self defaultOptions]];
159
-	RNNStackController* stack = self.stackController;
160
-	if (![withDefault.topBar.background.component.waitForRender getWithDefaultValue:NO] && readyBlock) {
161
-		readyBlock();
162
-		readyBlock = nil;
163
-	}
164
-    
165
-	if (withDefault.topBar.background.component.name.hasValue) {
166
-		NSString* currentChildComponentId = [stack getCurrentChild].layoutInfo.componentId;
167
-		_topBarBackgroundReactView = [_componentRegistry createComponentIfNotExists:withDefault.topBar.background.component parentComponentId:currentChildComponentId componentType:RNNComponentTypeTopBarBackground reactViewReadyBlock:readyBlock];
168
-		
169
-	} else {
159
+    RNNStackController* stack = self.stackController;
160
+    if (![withDefault.topBar.background.component.waitForRender getWithDefaultValue:NO] && readyBlock) {
161
+        readyBlock();
162
+        readyBlock = nil;
163
+    }
164
+    
165
+    if (withDefault.topBar.background.component.name.hasValue) {
166
+        NSString* currentChildComponentId = [stack getCurrentChild].layoutInfo.componentId;
167
+        _topBarBackgroundReactView = [_componentRegistry createComponentIfNotExists:withDefault.topBar.background.component parentComponentId:currentChildComponentId componentType:RNNComponentTypeTopBarBackground reactViewReadyBlock:readyBlock];
168
+        
169
+    } else {
170 170
         [_topBarBackgroundReactView componentDidDisappear];
171
-		[_customTopBarBackground removeFromSuperview];
172
-		_customTopBarBackground = nil;
173
-		if (readyBlock) {
174
-			readyBlock();
175
-		}
176
-	}
171
+        [_customTopBarBackground removeFromSuperview];
172
+        _customTopBarBackground = nil;
173
+        if (readyBlock) {
174
+            readyBlock();
175
+        }
176
+    }
177 177
 }
178 178
 
179 179
 - (void)presentBackgroundComponent {
180
-	RNNStackController* stack = self.stackController;
181
-	if (_customTopBarBackground) {
182
-		[_customTopBarBackground removeFromSuperview];
183
-	}
184
-	_customTopBarBackground = [[RNNCustomTitleView alloc] initWithFrame:stack.navigationBar.bounds subView:_topBarBackgroundReactView alignment:@"fill"];
185
-	
186
-	[stack.navigationBar insertSubview:_customTopBarBackground atIndex:1];
180
+    RNNStackController* stack = self.stackController;
181
+    if (_customTopBarBackground) {
182
+        [_customTopBarBackground removeFromSuperview];
183
+    }
184
+    _customTopBarBackground = [[RNNCustomTitleView alloc] initWithFrame:stack.navigationBar.bounds subView:_topBarBackgroundReactView alignment:@"fill"];
185
+    
186
+    [stack.navigationBar insertSubview:_customTopBarBackground atIndex:1];
187 187
     [_topBarBackgroundReactView componentDidAppear];
188 188
 }
189 189
 
190 190
 - (void)dealloc {
191
-	[_componentRegistry removeComponent:self.boundComponentId];
191
+    [_componentRegistry removeComponent:self.boundComponentId];
192 192
 }
193 193
 
194 194
 @end

+ 1
- 2
lib/ios/RNNTitleOptions.h Zobrazit soubor

@@ -9,10 +9,9 @@
9 9
 @property (nonatomic, strong) Color* color;
10 10
 @property (nonatomic, strong) Text* fontFamily;
11 11
 @property (nonatomic, strong) Text* fontWeight;
12
-
13 12
 @property (nonatomic, strong) RNNComponentOptions* component;
14 13
 @property (nonatomic, strong) Text* componentAlignment;
15 14
 
16
-@property (nonatomic, strong) NSDictionary* fontAttributes;
15
+- (BOOL)hasValue;
17 16
 
18 17
 @end

+ 15
- 11
lib/ios/RNNTitleOptions.m Zobrazit soubor

@@ -3,17 +3,21 @@
3 3
 @implementation RNNTitleOptions
4 4
 
5 5
 - (instancetype)initWithDict:(NSDictionary *)dict {
6
-	self = [super init];
7
-	
8
-	self.text = [TextParser parse:dict key:@"text"];
9
-	self.fontFamily = [TextParser parse:dict key:@"fontFamily"];
10
-	self.fontSize = [NumberParser parse:dict key:@"fontSize"];
11
-	self.fontWeight = [TextParser parse:dict key:@"fontWeight"];
12
-	self.color = [ColorParser parse:dict key:@"color"];
13
-	
14
-	self.component = [[RNNComponentOptions alloc] initWithDict:dict[@"component"]];
15
-	
16
-	return self;
6
+    self = [super init];
7
+    
8
+    self.text = [TextParser parse:dict key:@"text"];
9
+    self.fontFamily = [TextParser parse:dict key:@"fontFamily"];
10
+    self.fontSize = [NumberParser parse:dict key:@"fontSize"];
11
+    self.fontWeight = [TextParser parse:dict key:@"fontWeight"];
12
+    self.color = [ColorParser parse:dict key:@"color"];
13
+    
14
+    self.component = [[RNNComponentOptions alloc] initWithDict:dict[@"component"]];
15
+    
16
+    return self;
17
+}
18
+
19
+- (BOOL)hasValue {
20
+    return self.text.hasValue || self.fontFamily.hasValue || self.fontSize.hasValue || self.fontWeight.hasValue || self.color.hasValue || self.component.hasValue || self.componentAlignment.hasValue;
17 21
 }
18 22
 
19 23
 @end

+ 1
- 1
lib/ios/TopBarPresenter.h Zobrazit soubor

@@ -7,7 +7,7 @@
7 7
 
8 8
 - (void)applyOptionsBeforePopping:(RNNTopBarOptions *)options;
9 9
 
10
-- (void)mergeOptions:(RNNTopBarOptions *)options defaultOptions:(RNNTopBarOptions *)defaultOptions;
10
+- (void)mergeOptions:(RNNTopBarOptions *)options withDefault:(RNNTopBarOptions *)defaultOptions;
11 11
 
12 12
 - (instancetype)initWithNavigationController:(UINavigationController *)boundNavigationController;
13 13
 

+ 5
- 3
lib/ios/TopBarPresenter.m Zobrazit soubor

@@ -25,7 +25,7 @@
25 25
     [self setLargeTitleAttributes:options.largeTitle];
26 26
 }
27 27
 
28
-- (void)mergeOptions:(RNNTopBarOptions *)options defaultOptions:(RNNTopBarOptions *)defaultOptions {
28
+- (void)mergeOptions:(RNNTopBarOptions *)options withDefault:(RNNTopBarOptions *)withDefault {
29 29
     if (options.background.color.hasValue) {
30 30
         [self setBackgroundColor:options.background.color.get];
31 31
     }
@@ -43,10 +43,12 @@
43 43
         [self setLargeTitleAttributes:largeTitleOptions];
44 44
     }
45 45
 
46
-    [self setTitleAttributes:options.title];
46
+    if (options.title.hasValue) {
47
+        [self setTitleAttributes:withDefault.title];
48
+    }
47 49
     
48 50
     if (options.backButton.hasValue) {
49
-        [self setBackButtonIcon:[defaultOptions.backButton.icon getWithDefaultValue:nil] withColor:[defaultOptions.backButton.color getWithDefaultValue:nil] title:[defaultOptions.backButton.title getWithDefaultValue:nil] showTitle:[defaultOptions.backButton.showTitle getWithDefaultValue:YES]];
51
+        [self setBackButtonIcon:[withDefault.backButton.icon getWithDefaultValue:nil] withColor:[withDefault.backButton.color getWithDefaultValue:nil] title:[withDefault.backButton.title getWithDefaultValue:nil] showTitle:[withDefault.backButton.showTitle getWithDefaultValue:YES]];
50 52
     }
51 53
 }
52 54
 

+ 36
- 0
playground/ios/NavigationTests/TopBarAppearancePresenterTest.m Zobrazit soubor

@@ -0,0 +1,36 @@
1
+#import <XCTest/XCTest.h>
2
+#import <OCMock/OCMock.h>
3
+#import <ReactNativeNavigation/TopBarAppearancePresenter.h>
4
+#import "UIViewController+RNNOptions.h"
5
+#import <ReactNativeNavigation/RNNStackController.h>
6
+
7
+@interface TopBarAppearancePresenterTest : XCTestCase
8
+
9
+@end
10
+
11
+@implementation TopBarAppearancePresenterTest {
12
+	TopBarAppearancePresenter* _uut;
13
+	RNNStackController* _stack;
14
+}
15
+
16
+- (void)setUp {
17
+    [super setUp];
18
+	_stack = [[RNNStackController alloc] initWithLayoutInfo:nil creator:nil options:[[RNNNavigationOptions alloc] initEmptyOptions] defaultOptions:[[RNNNavigationOptions alloc] initEmptyOptions] presenter:_uut eventEmitter:nil childViewControllers:@[]];
19
+	_uut = [[TopBarAppearancePresenter alloc] initWithNavigationController:_stack];
20
+}
21
+
22
+- (void)testMergeOptions_shouldMergeWithDefault {
23
+	RNNNavigationOptions* mergeOptions = [[RNNNavigationOptions alloc] initEmptyOptions];
24
+	RNNNavigationOptions* defaultOptions = [[RNNNavigationOptions alloc] initEmptyOptions];
25
+	defaultOptions.topBar.title.color = [Color withColor:UIColor.redColor];
26
+	
27
+	mergeOptions.topBar.title.fontSize = [Number withValue:@(21)];
28
+	RNNNavigationOptions* withDefault = [mergeOptions withDefault:defaultOptions];
29
+	[_uut mergeOptions:mergeOptions.topBar withDefault:withDefault.topBar];
30
+	XCTAssertEqual(_stack.navigationBar.standardAppearance.titleTextAttributes[NSForegroundColorAttributeName], UIColor.redColor);
31
+	UIFont* font = _stack.navigationBar.standardAppearance.titleTextAttributes[NSFontAttributeName];
32
+	XCTAssertEqual(font.pointSize, 21);
33
+}
34
+
35
+
36
+@end

+ 4
- 0
playground/ios/playground.xcodeproj/project.pbxproj Zobrazit soubor

@@ -16,6 +16,7 @@
16 16
 		50647FE323E3196800B92025 /* RNNExternalViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 50647FE223E3196800B92025 /* RNNExternalViewControllerTests.m */; };
17 17
 		50996C6823AA477400008F89 /* RNNRootViewControllerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 50996C6723AA477400008F89 /* RNNRootViewControllerTest.m */; };
18 18
 		50996C6923AA487800008F89 /* RNNTestRootViewCreator.m in Sources */ = {isa = PBXBuildFile; fileRef = E58D263D2385888C003F36BA /* RNNTestRootViewCreator.m */; };
19
+		50BCB27623F1A2B100D6C8E5 /* TopBarAppearancePresenterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 50BCB27523F1A26600D6C8E5 /* TopBarAppearancePresenterTest.m */; };
19 20
 		67C681D42B662A53F29C19DA /* Pods_NavigationIOS12Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEE0B5D45FD34FBABC6586CF /* Pods_NavigationIOS12Tests.framework */; };
20 21
 		9D204F3DC4FBCD81583BF99F /* Pods_playground.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A3340545EAAF11C1F146864 /* Pods_playground.framework */; };
21 22
 		E5046080227748EA00212BD8 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E504607F227748EA00212BD8 /* JavaScriptCore.framework */; };
@@ -88,6 +89,7 @@
88 89
 		50996C5D23AA46DD00008F89 /* NavigationIOS12Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NavigationIOS12Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
89 90
 		50996C6123AA46DD00008F89 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
90 91
 		50996C6723AA477400008F89 /* RNNRootViewControllerTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNRootViewControllerTest.m; sourceTree = "<group>"; };
92
+		50BCB27523F1A26600D6C8E5 /* TopBarAppearancePresenterTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TopBarAppearancePresenterTest.m; sourceTree = "<group>"; };
91 93
 		7F8E255E2E08F6ECE7DF6FE3 /* Pods-playground.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-playground.release.xcconfig"; path = "Target Support Files/Pods-playground/Pods-playground.release.xcconfig"; sourceTree = "<group>"; };
92 94
 		84E32151E3A71C2B7328BCB4 /* Pods_NavigationTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NavigationTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
93 95
 		B484A10A046B0046B98A76B5 /* Pods-playground.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-playground.debug.xcconfig"; path = "Target Support Files/Pods-playground/Pods-playground.debug.xcconfig"; sourceTree = "<group>"; };
@@ -247,6 +249,7 @@
247 249
 			children = (
248 250
 				E58D26442385888C003F36BA /* Options */,
249 251
 				E58D26422385888C003F36BA /* RNNBasePresenterTest.m */,
252
+				50BCB27523F1A26600D6C8E5 /* TopBarAppearancePresenterTest.m */,
250 253
 				E58D26412385888C003F36BA /* RNNCommandsHandlerTest.m */,
251 254
 				E58D26352385888B003F36BA /* RNNComponentPresenterTest.m */,
252 255
 				E58D26402385888C003F36BA /* RNNControllerFactoryTest.m */,
@@ -738,6 +741,7 @@
738 741
 			files = (
739 742
 				E58D265B2385888C003F36BA /* UIViewController+RNNOptionsTest.m in Sources */,
740 743
 				E58D26532385888C003F36BA /* RNNSideMenuPresenterTest.m in Sources */,
744
+				50BCB27623F1A2B100D6C8E5 /* TopBarAppearancePresenterTest.m in Sources */,
741 745
 				50647FE323E3196800B92025 /* RNNExternalViewControllerTests.m in Sources */,
742 746
 				E58D264D2385888C003F36BA /* RNNOverlayManagerTest.m in Sources */,
743 747
 				501C86B9239FE9C400E0B631 /* UIImage+Utils.m in Sources */,