在 viewDidLoad 和 viewDidAppear 之前 performSegueWithIdentifier 有时有效,有时无效

Posted

技术标签:

【中文标题】在 viewDidLoad 和 viewDidAppear 之前 performSegueWithIdentifier 有时有效,有时无效【英文标题】:performSegueWithIdentifier before viewDidLoad and viewDidAppear sometimes it works and sometimes not 【发布时间】:2015-11-24 09:56:54 【问题描述】:

当我在viewDidLoadviewDidAppear 之前调用performSegueWithIdentifier 时,有时会起作用,有时会不起作用。

AppDelegate

- (void)applicationDidBecomeActive:(UIApplication *)application 
   NSLog(@"applicationDidBecomeActive");
[self abcNotif]; // the method post the notification.

VC1:

-(void)awakeFromNib 

    NSLog(@"awakeFromNib");
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(theNotif:) name:@"abcNotif" object:nil];


-(void)theNotif:(UILocalNotification*)notif 
    if([[[NSUserDefaults standardUserDefaults]valueForKey:@"flag"]isEqualToString:@"YES"]) 
        [self performSegueWithIdentifier:@"seg1" sender:self];
         NSLog(@"theNotif = %@", [[notif userInfo]valueForKey:@"notif1Key"]);
    

登录控制台

awakeFromNib
didFinishLaunchingWithOptions
applicationDidBecomeActive
theNotif = notif1Value
viewDidLoad

尽管在viewDidLoadviewDidAppear 之前调用了performSegueWithIdentifier,但一切正常。但在某些情况下,这不起作用。为什么会有这种行为。人们也问了这些问题Why doesn't performSegueWithIdentifier work inside viewDidLoad?

【问题讨论】:

【参考方案1】:

要理解的关键是 UIViewController 子类会延迟加载(创建)它们的视图属性。所以 viewDidLoad 会在视图加载后被调用,但那是什么时候呢?当然,启动应用程序的正常周期会在某个时间点将其添加到窗口中,但您可以通过在视图上进行调用来使其更早发生。尝试插入[self view];在您调用 performSegue.. 之前,这将确保加载视图。即便如此,它也不能确保视图已添加到窗口中,如果还没有发生,那么我看不到如何推送模式。

【讨论】:

在调用 [self view] 之后唯一的变化是 viewDidLoad 在通知之前被调用。但是在 viewDidLoad 和 viewDidAppear 之前 performSegueWithIdentifier 是如何工作的? 好吧,如果你的 segue 正在推送另一个 ViewController,那么一个 viewController 怎么能在它进入堆栈之前推送另一个呢? 这就是我要问的:)

以上是关于在 viewDidLoad 和 viewDidAppear 之前 performSegueWithIdentifier 有时有效,有时无效的主要内容,如果未能解决你的问题,请参考以下文章

viewDidLoad 和 viewDidAppear 的区别

在 viewDidLoad 和 viewDidAppear 之前 performSegueWithIdentifier 有时有效,有时无效

关于 viewController 的“viewDidLoad”和“viewWillAppear”方法

viewDidLoad和loadView之间的区别?

在 super.viewDidLoad() 之前和之后不同的 UIImageView.frame.size :我做错了啥?

在 UIViewController 上加载数据:viewDidLoad 和 viewWillAppear - 啥是正确的逻辑?