Skip to content

Commit

Permalink
fix: 检索响应链逻辑完善,支持响应链节点同名情况。
Browse files Browse the repository at this point in the history
  • Loading branch information
Hulk committed Aug 3, 2021
1 parent 7dbd779 commit 8653466
Show file tree
Hide file tree
Showing 7 changed files with 320 additions and 258 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
cellSectionOrOriginX:(CGFloat)cellSectionOrOriginX
cellRowOrOriginY:(CGFloat)cellRowOrOriginY
fromSuperView:(UIView*)superView;
- (UIResponder*)searchResponderWithClassName:(NSString*)className superResponder:(UIResponder*)superResponder;
- (NSArray<UIResponder*>*)searchRespondersWithClassName:(NSString*)className superResponders:(NSArray<UIResponder*>*)superResponders;
- (void)scrollToIdealOffsetWithScrollView:(UIScrollView*)scrollView targetElement:(UIView*)targetElement;
- (void)highlightTheElement:(UIView*)element withCompletion:(void(^)(void))block;
- (BOOL)isAreaInfoEqualBetween:(NSString*)one withAnother:(NSString*)another allowCompatibleMode:(BOOL)allowCompatibleMode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,34 +189,37 @@ - (UIView*)searchScrollViewCellWithScrollViewClassName:(NSString*)scrollViewClas
return nil;
}

- (UIResponder*)searchResponderWithClassName:(NSString*)className superResponder:(UIResponder*)superResponder {
if ([superResponder isKindOfClass:[UIViewController class]]) {
UIViewController *viewController = (UIViewController*)superResponder;
for (UIViewController *responder in viewController.childViewControllers) {
// 场景:一个viewController下有4个同样的子viewController。
if ([responder isKindOfClass:NSClassFromString(className)] && responder.view.superview) {
if ([superResponder isKindOfClass:[UINavigationController class]]) {
UINavigationController *navController = (UINavigationController*)superResponder;
if (navController.topViewController == responder
|| navController.visibleViewController == responder) {
return responder;
- (NSArray<UIResponder*>*)searchRespondersWithClassName:(NSString*)className superResponders:(NSArray<UIResponder*>*)superResponders {
NSMutableArray *allResponders = [NSMutableArray array];
for (UIResponder *superResponder in superResponders) {
if ([superResponder isKindOfClass:[UIViewController class]]) {
UIViewController *viewController = (UIViewController*)superResponder;
for (UIViewController *responder in viewController.childViewControllers) {
// 场景:一个viewController下有4个同样的子viewController。
if ([responder isKindOfClass:NSClassFromString(className)] && responder.view.superview) {
if ([superResponder isKindOfClass:[UINavigationController class]]) {
UINavigationController *navController = (UINavigationController*)superResponder;
if (navController.topViewController == responder
|| navController.visibleViewController == responder) {
[allResponders addObject:responder];
}
}
else {
[allResponders addObject:responder];
}
}
else {
return responder;
}
}
}
}
else if ([superResponder isKindOfClass:[UIView class]]) {
UIView *view = (UIView*)superResponder;
for (UIResponder *responder in [view subviews]) {
if ([responder isKindOfClass:NSClassFromString(className)]) {
return responder;
else if ([superResponder isKindOfClass:[UIView class]]) {
UIView *view = (UIView*)superResponder;
for (UIResponder *responder in [view subviews]) {
if ([responder isKindOfClass:NSClassFromString(className)]) {
[allResponders addObject:responder];
}
}
}
}
return nil;
return [allResponders copy];
}

- (void)scrollToIdealOffsetWithScrollView:(UIScrollView*)scrollView targetElement:(UIView*)targetElement {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,36 +29,47 @@ - (PrismInstructionParseResult)parseWithFormatter:(PrismInstructionFormatter *)f
return PrismInstructionParseResultFail;
}

NSArray<UIResponder*> *allPossibleResponder = [NSArray arrayWithObject:responder];
for (NSInteger index = 2; index < viewPathArray.count; index++) {
Class class = NSClassFromString(viewPathArray[index]);
if (!class) {
break;
}
UIResponder *result = [self searchResponderWithClassName:viewPathArray[index] superResponder:responder];
if (!result) {
NSArray<UIResponder*> *result = [self searchRespondersWithClassName:viewPathArray[index] superResponders:allPossibleResponder];
if (!result.count) {
break;
}
responder = result;
allPossibleResponder = result;
}

// 解析列表信息
NSArray<NSString*> *viewListArray = [formatter instructionFragmentWithType:PrismInstructionFragmentTypeViewList];
UIView *targetView = [responder isKindOfClass:[UIViewController class]] ? [(UIViewController*)responder view] : (UIView*)responder;
for (NSInteger index = 1; index < viewListArray.count; index = index + 4) {
if ([NSClassFromString(viewListArray[index]) isSubclassOfClass:[UIScrollView class]]) {
NSString *scrollViewClassName = viewListArray[index];
NSString *cellClassName = viewListArray[index + 1];
CGFloat cellSectionOrOriginX = viewListArray[index + 2].floatValue;
CGFloat cellRowOrOriginY = viewListArray[index + 3].floatValue;
UIView *scrollViewCell = [self searchScrollViewCellWithScrollViewClassName:scrollViewClassName
cellClassName:cellClassName
cellSectionOrOriginX:cellSectionOrOriginX
cellRowOrOriginY:cellRowOrOriginY
fromSuperView:targetView];
if (!scrollViewCell) {
return PrismInstructionParseResultFail;
UIView *targetView = nil;

for (UIResponder *possibleResponder in allPossibleResponder) {

// 解析列表信息
NSArray<NSString*> *viewListArray = [formatter instructionFragmentWithType:PrismInstructionFragmentTypeViewList];
targetView = [possibleResponder isKindOfClass:[UIViewController class]] ? [(UIViewController*)possibleResponder view] : (UIView*)possibleResponder;
for (NSInteger index = 1; index < viewListArray.count; index = index + 4) {
if ([NSClassFromString(viewListArray[index]) isSubclassOfClass:[UIScrollView class]]) {
NSString *scrollViewClassName = viewListArray[index];
NSString *cellClassName = viewListArray[index + 1];
CGFloat cellSectionOrOriginX = viewListArray[index + 2].floatValue;
CGFloat cellRowOrOriginY = viewListArray[index + 3].floatValue;
UIView *scrollViewCell = [self searchScrollViewCellWithScrollViewClassName:scrollViewClassName
cellClassName:cellClassName
cellSectionOrOriginX:cellSectionOrOriginX
cellRowOrOriginY:cellRowOrOriginY
fromSuperView:targetView];
if (!scrollViewCell) {
targetView = nil;
break;
}
targetView = scrollViewCell;
}
targetView = scrollViewCell;
}

if (targetView) {
break;
}
}

Expand Down
Loading

0 comments on commit 8653466

Please sign in to comment.