@@ -28,6 +28,8 @@ @interface LKStaticHierarchyDataSource ()
2828
2929@property (nonatomic , assign ) BOOL shouldIgnoreFastModeAutoUpdate;
3030@property (nonatomic , assign ) BOOL isUsingDanceUI;
31+ @property (nonatomic , assign , readwrite ) BOOL swiftUISemanticHierarchyAvailable;
32+ @property (nonatomic , strong ) LookinDisplayItem *swiftUISemanticRoot;
3133
3234@end
3335
@@ -56,7 +58,55 @@ - (instancetype)init {
5658#pragma mark - Public
5759
5860- (void )reloadWithHierarchyInfo : (LookinHierarchyInfo *)info keepState : (BOOL )keepState {
61+ NSString *selectedSemanticIdentifier = nil ;
62+ NSMutableDictionary <NSString *, NSNumber *> *semanticExpansionState = nil ;
63+ if (keepState && self.showsSwiftUISemanticHierarchy ) {
64+ selectedSemanticIdentifier = self.selectedItem .customInfo .semanticIdentifier ;
65+ semanticExpansionState = [NSMutableDictionary dictionary ];
66+ [self .flatItems enumerateObjectsUsingBlock: ^(LookinDisplayItem *item, NSUInteger idx, BOOL *stop) {
67+ NSString *identifier = item.customInfo .semanticIdentifier ;
68+ if (identifier.length > 0 ) {
69+ semanticExpansionState[identifier] = @(item.isExpanded );
70+ }
71+ }];
72+ }
73+
74+ NSArray <LookinDisplayItem *> *allItems = [LookinDisplayItem flatItemsFromHierarchicalItems: info.displayItems];
75+ LookinDisplayItem *semanticRoot = [allItems lookin_firstFiltered: ^BOOL (LookinDisplayItem *item) {
76+ return [item.customInfo.semanticKind isEqualToString: @" swiftui-root" ];
77+ }];
78+ BOOL wasAvailable = self.swiftUISemanticHierarchyAvailable ;
79+ self.swiftUISemanticRoot = semanticRoot.copy ;
80+ self.swiftUISemanticHierarchyAvailable = (semanticRoot != nil );
81+ if (!wasAvailable && self.swiftUISemanticHierarchyAvailable ) {
82+ _showsSwiftUISemanticHierarchy = YES ;
83+ } else if (!self.swiftUISemanticHierarchyAvailable ) {
84+ _showsSwiftUISemanticHierarchy = NO ;
85+ }
86+
5987 [super reloadWithHierarchyInfo: info keepState: keepState];
88+
89+ if (semanticExpansionState.count > 0 ) {
90+ [self .flatItems enumerateObjectsUsingBlock: ^(LookinDisplayItem *item, NSUInteger idx, BOOL *stop) {
91+ NSString *identifier = item.customInfo .semanticIdentifier ;
92+ if (identifier.length == 0 ) {
93+ return ;
94+ }
95+ NSNumber *wasExpanded = semanticExpansionState[identifier];
96+ if (wasExpanded) {
97+ item.isExpanded = wasExpanded.boolValue ;
98+ }
99+ }];
100+ [self buildDisplayingFlatItems ];
101+ }
102+ if (selectedSemanticIdentifier.length > 0 ) {
103+ LookinDisplayItem *matchingItem = [self .flatItems lookin_firstFiltered: ^BOOL (LookinDisplayItem *item) {
104+ return [item.customInfo.semanticIdentifier isEqualToString: selectedSemanticIdentifier];
105+ }];
106+ if (matchingItem) {
107+ self.selectedItem = matchingItem;
108+ }
109+ }
60110
61111 _appInfo = info.appInfo ;
62112
@@ -81,6 +131,24 @@ - (void)reloadWithHierarchyInfo:(LookinHierarchyInfo *)info keepState:(BOOL)keep
81131 }
82132}
83133
134+ - (NSArray <LookinDisplayItem *> *)hierarchyRootItemsForInfo : (LookinHierarchyInfo *)info {
135+ if (self.showsSwiftUISemanticHierarchy && self.swiftUISemanticRoot ) {
136+ return @[self .swiftUISemanticRoot];
137+ }
138+ return [super hierarchyRootItemsForInfo: info];
139+ }
140+
141+ - (void )setShowsSwiftUISemanticHierarchy : (BOOL )showsSwiftUISemanticHierarchy {
142+ BOOL nextValue = showsSwiftUISemanticHierarchy && self.swiftUISemanticHierarchyAvailable ;
143+ if (_showsSwiftUISemanticHierarchy == nextValue) {
144+ return ;
145+ }
146+ _showsSwiftUISemanticHierarchy = nextValue;
147+ if (self.rawHierarchyInfo ) {
148+ [self reloadWithHierarchyInfo: self .rawHierarchyInfo keepState: NO ];
149+ }
150+ }
151+
84152- (void )modifyWithDisplayItemDetail : (LookinDisplayItemDetail *)detail {
85153 if (!detail) {
86154 return ;
@@ -155,7 +223,7 @@ - (void)modifyWithDisplayItemDetail:(LookinDisplayItemDetail *)detail {
155223
156224 displayItem.subitems = detail.subitems ;
157225 // 根据 subitems 属性打平为二维数组,同时给每个 item 设置 indentLevel
158- self.rawFlatItems = [LookinDisplayItem flatItemsFromHierarchicalItems: self .rawHierarchyInfo.displayItems ];
226+ self.rawFlatItems = [LookinDisplayItem flatItemsFromHierarchicalItems: [ self hierarchyRootItemsForInfo: self .rawHierarchyInfo] ];
159227 self.flatItems = self.rawFlatItems ;
160228 [self .didReloadHierarchyInfo sendNext: nil ];
161229
0 commit comments