TouchesBegan 在下一个视图控制器中被识别

Posted

技术标签:

【中文标题】TouchesBegan 在下一个视图控制器中被识别【英文标题】:TouchesBegan recognised in next view controller 【发布时间】:2017-02-25 19:09:20 【问题描述】:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
    UITouch *aTouch = [touches anyObject];

    NSLog(@"touch recognised");

    CGPoint location = [aTouch locationInView:_mainView];

    __block NSString *option = [[NSString alloc] init];
    __block NSString *type = [[NSString alloc] init];

    for (Selectors *tempView in _mainView.subviews) 
        if (CGRectContainsPoint(tempView.frame, location)) 
            NSLog(@"%@ : %@", tempView.option, tempView.type);

            option = tempView.option;
            type = tempView.type;

            break;
        
    


    [self moveToNextWeldCustomViewWithOption:option andType:type];



在我之前的 UIVIewController 中——那么我们在这里展示下一个 UIViewController

-(void)moveToNextWeldCustomViewWithOption:(NSString *)option andType:(NSString *)type 

    WeldDesignViewController *lobby = [self.storyboard instantiateViewControllerWithIdentifier:@"WeldDesignViewController"];

    lobby.option = option;
    lobby.type = type;

    [self presentViewController:lobby animated:NO completion:nil];


在下一个 UIViewController 中,在 viewDidAppear 方法之前我什么都不做 - 但是,开始的触摸仍在下一个 viewcontroller 中被识别。

【问题讨论】:

目前尚不清楚您到底在期待什么以及正在发生什么。你想在以前的视图控制器中获得这些触摸吗?你不是想要它们而是得到它们吗? @ChrisTrahey 简而言之,下一个视图控制器正在记录前一个视图控制器中的触摸。 那么,2 号视图控制器不再出现在屏幕上,但正在触摸吗?这两个视图控制器是同一个类吗? 【参考方案1】:

我认为问题在于,您称为“大厅”的 VC 在您展示它之后正在被释放。这在响应者链中将其排除在外。将该引用移动为呈现视图控制器的属性:

@property (nonatomic, strong) WeldDesignViewController* lobby;
// ...
-(void)moveToNextWeldCustomViewWithOption:(NSString *)option andType:(NSString *)type 

   self.lobby = [self.storyboard instantiateViewControllerWithIdentifier:@"WeldDesignViewController"];

    lobby.option = option;
    lobby.type = type;

    [self presentViewController:self.lobby animated:NO completion:nil];


您可能还需要在提供的 VC 中实现 touchesBagan,因为它可能会跟随响应者链到达前一个控制器。

【讨论】:

不幸的是,阅读后我希望它会这么简单,我错过了一个非常愚蠢的错误。但是,我仍然可以在下一个视图控制器中触摸上一个视图控制器的视图。 本质上,我可以单击与以前视图相同的位置,它们仍会从以前的视图控制器中开始的触摸记录下来。 天哪,最后一行日志说明了很多!看起来问题是“上游”,您的 TypeOfWeldViewController 的视图不在窗口层次结构中......这是如何呈现的? 您可以尝试在整个应用程序中实施我的答案中的建议并报告吗?您必须保留对呈现的视图控制器的强引用,这些视图控制器在它们呈现的范围内仍然存在。仅此一项就会导致各种问题。 更新答案!

以上是关于TouchesBegan 在下一个视图控制器中被识别的主要内容,如果未能解决你的问题,请参考以下文章

touchesBegan 不调用容器视图控制器

你如何知道在 touchesBegan 中被触摸的对象是啥?

touchesBegan 在 iOS 12 中被调用,但在 iOS 13 中未被调用

Obj-C - touchesBegan:在定义的区域

TouchesBegan 未在 480px 以下调用

集合视图控制器的 viewDidLayoutSubviews 在 iOS 7 中被重复调用