如何实例化第二个 ViewController 并停止第一个 ViewController 的方法

Posted

技术标签:

【中文标题】如何实例化第二个 ViewController 并停止第一个 ViewController 的方法【英文标题】:How to instantiate a second ViewController and stop the methods of the first ViewController 【发布时间】:2013-07-29 20:01:53 【问题描述】:

我有一个非常基本的应用程序,如果“if”语句的条件为真,则在其中实例化第二个 ViewController。加载第二个 ViewController 后,第一个 ViewController 的方法仍然运行。我需要停止所有以前的方法以使应用程序正确运行。

//在FirstViewController.h中

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController

    NSTimeInterval beginTouchTime;
    NSTimeInterval endTouchTime;
    NSTimeInterval touchTimeInterval;


@property (nonatomic, readonly) NSTimeInterval touchTimeInterval;

- (void) testMethod;

@end

//在FirstViewController.m中

#import "FirstViewController.h"
#import "SecondViewController.h"

@implementation FirstViewController

@synthesize touchTimeInterval;

- (void)viewDidLoad

    [super viewDidLoad]; 


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


- (void) testMethod

if (touchTimeInterval >= 3)

NSLog(@"Go to VC2");
SecondViewController *secondBViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
             [self presentViewController:secondViewController animated:YES completion:nil];



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    beginTouchTime = [event timestamp];
    NSLog(@"Touch began");


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    endTouchTime = [event timestamp];
    NSLog(@"Touch ended");

    touchTimeInterval = endTouchTime - beginTouchTime;
    NSLog(@"Time interval: %f", touchTimeInterval);

    [self testMethod]; // EDIT: USED TO BE IN viewDidLoad



@end

第二个屏幕成功加载,但日志消息仍然存在,这意味着 FirstViewController 的方法仍然存在,尽管在 SecondViewController 的视图中。我做错了什么?

【问题讨论】:

当你的第一个视图控制器不在屏幕上时,它不应该响应任何触摸。你说的就是这种情况吗? 这正是正在发生的事情。我觉得这很奇怪,而且它也使应用程序运行得非常慢。 这就是你所有的代码吗?当我尝试它时,它永远不会进入第二个视图控制器,因为 testMethod 永远不会再次调用,并且第一次调用时,touchTimeInterval 为 0。 很抱歉。当我输入代码时,我的 Xcode 项目没有打开。我的意思是在 touchesEnded 中调用该方法。请进行此更改,看看您是否遇到同样的问题。谢谢 【参考方案1】:

您所看到的是 UIKit 中事件处理方式的结果(查看“ios 事件处理指南”,尤其是“事件传递:响应者链”部分)。所以发生的事情是,由于 SecondViewController 的视图没有覆盖 touchesBegan 或 touchesEnded,触摸被传递到响应者链,首先到 SecondViewController,然后到 FirstViewController,它最终处理这些事件(FirstViewController 在之后仍然是窗口的根视图控制器模态演示)。

解决此问题的两种方法。您可以在 SecondViewController(或者我猜它的视图)中覆盖 touchesBegan 和 touchesEnded,并且只有空方法。

另一种方法是继承 FirstViewController 的视图,并覆盖那里的方法,而不是在控制器中。您仍然需要从控制器中展示 SecondViewController —— 您可以使用 [self.nextResponder someMethod] 从视图中调用一个方法来做到这一点。

【讨论】:

我尝试了你的第一个建议,它奏效了。谢谢!然而,第二种方式听起来更清晰但更令人困惑。在 someMethod 中我究竟会调用什么? @user2480376,someMethod 只会实例化 SecondViewController 并呈现它。在 testMethod(现在在视图中)中,您仍然会执行 if 语句检查 touchTimeInterval >= 3,如果是,则执行 [self.nextResponder someMethod]。 当我在 testMethod 中写入 [self.nextResponder someMethod] 行时,我收到错误:“UIResponder”没有可见的@interface 声明选择器“someMethod”。在 someMethod 下,我实例化 SecondVC 并呈现它。我错过了什么? @user2480376,你在FirstViewController的.h文件中声明了someMethod吗? @user2480376,哦,对不起,你需要转换 self.nextResponder: [(FirstViewController *)self.nextResponder someMethod];【参考方案2】:

看看- (void)viewWillDisappear:(BOOL)animated- (void)viewDidDisappear:(BOOL)animated 你可以在你的第一个视图控制器上实现这些方法来停止/禁用任何活动或触摸检测。

【讨论】:

我预计会出现这种情况,但我仍然无法让它停止记录第一个 VC 的消息。我从来没有完全理解你列出的两种方法。是否可以在两者中添加通用代码行,以便所有对象/方法完全停止?【参考方案3】:

SecondViewController 是 FirstViewController 的子类吗?如果是这样,触摸事件将通过继承链升级,直到它们被处理。您可以在 SecondViewController 中覆盖这些方法,让它们什么也不做(或任何您想要的)。

【讨论】:

SecondVC 不是 FirstVC 的子类。我的故事板中基本上有两个 VC,它们没有联系/segues。

以上是关于如何实例化第二个 ViewController 并停止第一个 ViewController 的方法的主要内容,如果未能解决你的问题,请参考以下文章

从一个 ViewController 中获取一个随机数并在第二个 ViewController 中使用它 - 更新

将 Class 结果放入第二个 viewController

如何在第二个 ViewController 表格视图中使用模型快速显示第一个 ViewController 值

如何通过 PageViewController 将 viewController 的数据传递给 pageViewController 的第二个 ViewController

我正在尝试从我的主 ViewController 调用一个函数并使用它在我的第二个 ViewController 中加载 JSON 数据

Swift:如何在实例化 viewController 之前加载 Firebase 数据?