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

时间:2013-07-29 20:01:54

标签: ios objective-c

我有一个非常基本的应用程序,如果'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的视图中。我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

另一种方法是将FirstViewController的视图子类化,并覆盖那里的方法,而不是在控制器中。您仍然需要从控制器进行SecondViewController的演示 - 您可以使用[self.nextResponder someMethod]从视图中调用一个方法来执行此操作。

答案 2 :(得分:0)

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