【问题标题】:Objective C how to stop infinte loop while moving from first VC to 2ndObjective C如何在从第一个VC移动到第二个时停止无限循环
【发布时间】:2017-01-05 07:48:56
【问题描述】:

我正在尝试构建一个启动画面,所以我希望第一个视图控制器在 3.0 秒后自动移动到第二个 ViwController 我尝试了下面的方法但是一个无限循环已经开始我应该做什么,我应该如何停止第二个视图控制器。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%p", self);
    NSLog(@"1st Controller");

    [self.navigationController setNavigationBarHidden:YES animated:YES];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{


        [self loadingNextView];
      });

}

    - (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}
- (void)loadingNextView{

    LoginViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [self.navigationController pushViewController:viewController animated:true];
}
//LoginViewController.h
@interface LoginViewController : ViewController

@end
//LoginViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"2nd View Controller");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

三秒钟后看看循环是如何工作的。

【问题讨论】:

  • performSelector:withObject:afterDelay: 启动 NSDefaultRunLoopMode。注释掉的时候为什么不用dispatch_after
  • @nynohu 先生,这两种方法我都试过了,但问题还是一样,让我更新更改。
  • @nynohu 是更新
  • 如果还是调用loadingNextView,看看你的viewWillAppear,是不是调用了很多次?
  • @nynohu 以前我用过同样的东西,但这是我第一次遇到问题。到达第二个视图控制器后如何将其解散回第一个视图控制器?

标签: ios objective-c uiviewcontroller uinavigationcontroller grand-central-dispatch


【解决方案1】:

你为什么不使用NSTimer 类。只需创建一个 10 秒的计时器,当 10 秒过去的计时器将触发该事件时,您可以移动到另一个 controller。像这样创建一个计时器

[NSTimer scheduledTimerWithTimeInterval:10.0
        target:self
        selector:@selector(targetMethod:)
        userInfo:nil
        repeats:NO];



    - (void)targetMethod:(NSTimer*)timer {
        [self loadingNextView];
    }

【讨论】:

【解决方案2】:

很简单,可以在vc1中添加一个属性判断是否是先来的:

结果:

适合 VC:

#import "ViewController.h"
#import "LoginViewController.h"

@interface ViewController ()

@property(nonatomic, assign) BOOL isFirstTime;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _isFirstTime = YES;
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
/*  [self performSelector:@selector(loadingNextView)
 withObject:nil afterDelay:1.0f]; */

    if (_isFirstTime == NO) {

        return;
    }

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{


    [self loadingNextView];
    _isFirstTime = NO;
    });

}
- (void)loadingNextView{

    LoginViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [self.navigationController pushViewController:viewController animated:true];
}
【解决方案3】:

试试这个

[NSTimer scheduledTimerWithTimeInterval:1.0 repeats:false block:^(NSTimer * _Nonnull timer) {
    [self loadingNextView];
}];

所以一点建议,您应该考虑呈现一个 loginViewController,而不是将其推送到 NavigationController 堆栈。如果你按下它,如果你不想让用户回到另一个 ViewController,你必须删除后退按钮。如果您提供它,您可以确保用户在不输入登录数据的情况下无法返回 firstVc。

在第二个 Vc 中你可以关闭 Vc 或者你可以展示一个新的 ViewController。

[self presentViewController:vc animated:YES completion:nil];

【讨论】:

  • 你能描述一下发生了什么吗?还有无限循环?
  • 先生,它在 1 秒后移动到第二个 VC,但是当它移动到第二个时它不会在第二个停止它继续解雇到第一个然后再次移动到第二个,这种情况一次又一次地发生
  • 那么你能把第二个VC的编码贴出来吗?我试过了,它对我有用。但是方法必须有点不同。我编辑了方法...
【解决方案4】:

您可以通过使用它来实现您的目标。

#import "DrawingViewController.h"
#import "SecondViewController.h"

@interface DrawingViewController ()

@end

@implementation DrawingViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [button removeFromSuperview];

    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(target:) userInfo:nil repeats:NO];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)target:(NSTimer*)timer {

    SecondViewController* controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    [self.navigationController pushViewController:controller animated:YES];
}

【讨论】:

    【解决方案5】:

    终于找到答案了。

        #import "ViewController.h"
        - (void)viewDidLoad {
            [super viewDidLoad];
            // Do any additional setup after loading the view, typically from a nib.
            NSLog(@"%p", self);
            [self.navigationController setNavigationBarHidden:YES animated:YES];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    
                NSLog(@"1st controller");
                [self loadingNextView];
            });
    
        }
    
    
        - (void)didReceiveMemoryWarning {
            [super didReceiveMemoryWarning];
            // Dispose of any resources that can be recreated.
        }
    
        - (void)loadingNextView{
    
            UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
            [self.navigationController pushViewController:viewController animated:true];
        }
    //LoginViewController.h
    #import "ViewController.h"
    
    @interface LoginViewController : UIViewController
    
    @end
    //LoginViewController.m
    #import "LoginViewController.h"
    
    @interface LoginViewController ()
    
    @end
    
    @implementation LoginViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        NSLog(@"2nd View Controller");
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2017-11-20
      • 2021-09-15
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多