【问题标题】:iOS 8 pushViewController not working, in iOS 7 everything works as expected, zero code changes?iOS 8 pushViewController 不起作用,在 iOS 7 中一切正常,零代码更改?
【发布时间】:2014-09-26 14:36:05
【问题描述】:

当我在 iOS 7 上运行我的应用程序时,一切正常。当我在 iOS 8 上运行我的应用程序时, 并没有按预期工作。这一切都无需对代码库进行一次编辑。

具体来说,我试图在堆栈上“推送”一个新的视图控制器,在 iOS 8 中没有任何反应。

起初我认为它可能与情节提要相关,因此从通过performSegueWithIdentifier 触发我的推送转场切换到使用instantiateViewControllerWithIdentifier 从情节提要手动加载它,然后通过[self.navigationController pushViewController:myVC animated:YES]; 呈现它。

上述任何一种技术都适用于 iOS 7。但是,在 iOS 8 设备上运行我的应用时,两种方法都失败。此外,我注意到调试器/NSLog 中有奇怪的行为。在 iOS 7 中,当我运行 NSLog(@"self.navigationController = %@", self.navigationController) 时,我得到(如预期的那样):

self.navigationController = <UINavigationController: 0x145986b0>

在 iOS 8 中,我还得到(如预期的那样):

self.navigationController = <UINavigationController: 0x15d646db0>

同时,在代码中的同一点,当我插入中断然后通过控制台检查内容时,如下所示:(lldb) po self.navigationController 在 iOS 7 中,我得到(如预期的那样):

(lldb) po self.navigationController <UINavigationController: 0x175810b0>

但是,在 iOS 8 中,我得到:

(lldb) po self.navigationController error: property 'navigationController' not found on object of type 'PHMenuTableViewController *' error: 1 errors parsing expression

在上述两个po 示例中,我正在使用“调试”构建配置进行构建。

最终,我只是想推动一个视图控制器。我的原始代码使用的是segue。在尝试调试时,我从 segue 移开使用 instantiateViewControllerWithIdentifier 和 [self.navigationController pushViewController:myVC animated:YES];。两种方法都可以在 iOS 7 上按预期工作。但是,无论我做什么,我都无法在 iOS 8 上运行,就像导航控制器是 nil 或其他东西一样,什么都没有发生!

有什么想法吗?

【问题讨论】:

  • 你试过NSLog应该出现的VC的viewDidLoad吗?被解雇了吗?
  • @ObiWanKeNerd 刚刚在viewDidLoad 中添加了一个中断。在 iOS 8 上运行时,viewDidLoad没有被调用。
  • 您是否尝试过使用第一种方法performseguewithidentifier,但使用modal segue 而不是push segue?只是想看看它是否是与应该提出的navigation controller 或viewController 相关的问题。你有prepare for segue的方法吗?您是否尝试在其中插入中断?
  • 好问题,谢谢。 performSegueWithIdentifier 似乎工作正常。当我向prepareForSegue 添加中断时,会触发中断。为了进行测试,我不再使用 segue,而是使用 instantiateViewControllerWithIdentifier 和 [self.navigationController pushViewController:myVC animated:YES];。现在这里有新信息:当我使用[self.navigationController presentViewController:myVC animated:YES completion:^{}]; 时,myVC 的viewDidLoad 方法会被调用,而pushViewController 不会。在这两种情况下,屏幕上都没有任何反应!
  • 我觉得我离解决这个问题越来越近了,因为我看到了这里的独特之处,那就是我的菜单 vc 正在通过自定义转换委托 menuVC.transitioningDelegate = self 呈现。该应用程序的视图层次结构如下所示:Nav VC > Base VC > Menu VC > Other VCs。 Base VC 通过自定义模态转换呈现 Menu VC。无法推送/呈现任何其他 VC 的是 Menu VC...

标签: ios objective-c iphone ios8 xcode6


【解决方案1】:

我的情况和你差不多。

我有一个名为 InventoryMatrixEditViewController 的 VC,它通过自定义的模态展示来展示。在这个 VC 中有一个方法叫做 -(void)viewDidLoad;设置布局:

- (void)_setupLayout
{
    if (_isToCreateNewMatrix) {
        //[self.view addSubview:self.attributesTableViewController.view];
        [self.attributesTableViewController addNewAttributeItem];
        [self.navigationController pushViewController:self.attributesTableViewController
                                             animated:Yes];
        return;
    }
....

如果动画标志为Yes,有时推送视图的viewDidLoad(self.attributesTableViewController)不会被调用(奇怪不是每次都会触发错误),但是app没有crash,只是呈现一个空白modalView甚至没有设置navigationBar。

但如果动画标志为 NO,则一切正常。

如果视图首先以模态方式呈现,我想知道这是一个错误还是苹果只是推动人们不要激活动画。

【讨论】:

  • 这不是答案
  • 它的措辞不像一个答案,但将动画标志设置为 NO 绝对适用于 iOS 8(现有代码适用于 iOS 7)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多