iOS Push Segue(以编程方式)有时会卡住但不会崩溃

Posted

技术标签:

【中文标题】iOS Push Segue(以编程方式)有时会卡住但不会崩溃【英文标题】:iOS Push Segue (programmatically) sometimes stuck but won't crash 【发布时间】:2015-03-18 04:22:04 【问题描述】:

当我打电话时:

[self.navigationController pushViewController:SOME_VIEW_CONTROLLER animated:YES];

应用随机卡住(它没有崩溃,所以没有错误日志)。试过调试没有结果。

注意:

    我从UIViewController 类别中将此称为pushViewController。 这有什么问题吗? 我没有使用故事板 问题随机存在(并非一直发生) 当它卡住时,viewDidAppear 不会被调用(viewWillAppear, viewWillLayoutSubviews, viewDidLayoutSubviews 仍然 叫) 我使用动画时从未出现过问题:否

一些代码sn-ps:

- (void)routeToBookingDetailsForCustomer:(BookingModel *)booking 
    VTBookingDetailsForCustomerViewController *vc = [VTBookingDetailsForCustomerViewController new];
    vc.booking = booking;
    [self.navigationController pushViewController:vc animated:YES];

刚刚找到另一个类似情况的帖子: pushViewController stuck or viewdidappear fail

【问题讨论】:

一些代码会很有用... [self.navigationController pushViewController:"view?"动画:是];你写在你的代码中吧? 你在使用故事板吗? @Vidhyanand900 不,我没有使用故事板 VTBookingDetailsForCustomerViewController 的视图是在哪里制作的?您有 xib 文件,还是在代码中显示它? 【参考方案1】:

我认为你必须像这样通过Nib name

- (void)routeToBookingDetailsForCustomer:(BookingModel *)booking
    VTBookingDetailsForCustomerViewController *vc = [[VTBookingDetailsForCustomerViewController alloc]initWithNibName:@"VTBookingDetailsForCustomerViewController" bundle:nil];
    vc.booking = booking;
    [self.navigationController pushViewController:vc animated:YES];

笔尖名称表示您的XIB name 任何XIB name 用于您的VTBookingDetailsForCustomerViewController,您必须在initWithNibName:@"yourXIBname" 中传递它

【讨论】:

看不懂,为什么要用storyboard/nib初始化呢? 没有XIB,控制器在哪里推? 没有 XIB 会在你的屏幕上显示什么..?这需要一些视图(XIB)来展示你的设计...... 我把我的代码改成了你建议的,但它并没有解决问题。此外,正如我所提到的,问题是“随机发生的”。如果问题真的是因为没有加载xib,为什么没有出现问题时会出现视图 一定是您的 VTBookingDetailsForCustomerViewController 中的一些问题。显示 viewdidload、viewdidappear 的代码。不要对两个线程发表评论。我会关注这个话题。 :)【参考方案2】:

你试过这种方法吗?

someViewController *someVC = [someViewController alloc] initWithNibName:@"someViewController " bundle:NULL];
someVC.someVariable  = someValue;
[self.navigationController pushViewController:someVC animated:YES];

编辑:刚刚看到'Dipen Chudasama'已经回答了!

【讨论】:

看不懂,为什么要用storyboard/nib初始化呢? 因为,我们必须告诉pushViewController 它要进入哪个viewController。 XIB(新名称)和 NIB(旧名称)名称相同。所以,我们一起初始化类 someViewController 和 nib/xib 'someViewController'。因为,我们必须告诉pushViewController 它要进入哪个viewController。 XIB(新名称)和 NIB(旧名称)名称相同。所以,我们一起初始化类 someViewController 和 nib/xib 'someViewController'。 Refer 我把我的代码改成了你建议的,但它并没有解决问题。此外,正如我所提到的,这个问题是“随机发生的”。如果问题真的是因为没有加载xib,为什么没有出现问题时会出现视图 一定是您的 VTBookingDetailsForCustomerViewController 中的一些问题。显示viewdidload的代码,viewdidappear。 我不这么认为,因为我已经删除了 viewdidload/viewdidappear 中的所有代码。更新:当我使用动画时问题解决了:NO 动画有问题吗?【参考方案3】:

您是否通过实现UINavigationProtocolDelegate 结合UIViewControllerInteractiveTransitioning 来使用自定义过渡动画?

我在自己的应用程序中遇到了这个问题,结果发现我错误地启动了一个我从未完成的交互式过渡。在这种情况下,所有调试都显示控制器已被推送,但 UI 直到我的应用更改状态后才更新。

【讨论】:

【参考方案4】:

请在主队列中尝试 pushViewController 代码。

dispatch_async (dispatch_get_main_queue(), ^

VTBookingDetailsForCustomerViewController *vc = [VTBookingDetailsForCustomerViewController new];
vc.booking = booking;
[self.navigationController pushViewController:vc animated:YES];

);

【讨论】:

以上是关于iOS Push Segue(以编程方式)有时会卡住但不会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试中以编程方式执行 Unwind Segue

如何使用 Swift 在 iOS 中以编程方式进行 segue

无法在 IOS8 中使用 showSegue 以编程方式“推送”视图控制器

Push Segue 后在导航栏上添加 UIView

push 在以模态方式呈现的控制器上不起作用

Segue 和 Button 以编程方式快速