【问题标题】:How can I load a view controller in viewDidLoad?如何在 viewDidLoad 中加载视图控制器?
【发布时间】:2014-11-17 16:33:58
【问题描述】:

我在 viewDidLoad 中有以下代码。我想比较我保存在 nsuserdefaults 限制时间中的 nsdate。

if ([[NSDate date]timeIntervalSinceDate:[restrictionTime objectForKey:@"time"]] < 86400) {

    ResultsViewController *destinationViewController = [[ResultsViewController alloc]init];
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    destinationViewController = [storyboard instantiateViewControllerWithIdentifier:@"results"];

    [self presentViewController:destinationViewController animated:NO completion:^{
    }]; // !!!!! this line 

}

当它到达代码中指定的行时,应用程序会递归运行 viewDidLoad。 我要做的就是比较现在的时间和我保存的时间NSUserDefaults。如果不到一天,那么它将呈现另一个 viewController。

*如果我注释掉上面指定的行,它运行良好。

NSLog(@"%f", [[NSDate date]timeIntervalSinceDate:[restrictionTime objectForKey:@"time"]]);

上面的 NSLog 返回 2167.23445。

【问题讨论】:

  • 在视图出现之前不要显示任何视图控制器!
  • 在视图生命周期中调用 –viewDidAppear: 方法之前,您不应尝试将新视图推送到导航堆栈中。

标签: ios objective-c nsdate


【解决方案1】:

如果您的应用程序正在递归运行 viewDidLoad,这表明您正在通过以下方式再次调用同一个 VC:

    destinationViewController = [storyboard instantiateViewControllerWithIdentifier:@"results"];

你能确认这不是故意的吗?我很困惑为什么你可能会再次实例化同一个 VC。如果这是问题所在,我建议您仔细检查您实际要实例化的 VC 的名称,以防出现这种情况。

【讨论】:

  • 100% 确定我没有调用同一个 VC
  • 你能在被调用的 viewDidLoad 函数的开头断点并查看你的堆栈跟踪,看看是谁在调用它吗?
【解决方案2】:

您正在此块中创建两个视图控制器:

// Creating a ResultsViewController
ResultsViewController *destinationViewController = [[ResultsViewController alloc]init];

// Creating (I assume) another ResultsViewController
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
destinationViewController = [storyboard instantiateViewControllerWithIdentifier:@"results"];

您确定您的意思是“递归”吗?或者你的意思是两次?同样正如其他人所提到的,您可能应该在 -viewDidAppear 中展示新控制器:

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多