【问题标题】:iOS 5 : -viewWillAppear is not called after dismissing the modal in iPadiOS 5:在 iPad 中关闭模式后不调用 -viewWillAppear
【发布时间】:2011-12-09 19:14:00
【问题描述】:

我正在使用以下代码呈现模态:

AddName *add = [[AddName alloc] initWithNibName:@"AddName" bundle:nil]
add.modalPresentationStyle = UIModalPresentationFormSheet;

[self presentModalView:add animated:YES];

在我的工作之后,我使用以下代码返回我的主视图。

[self dismissModalViewControllerAnimated:YES];

所以默认调用-viewWillAppear

我的问题是,

iOS4.3 上运行良好。

但它不适用于 iOS5

我该怎么办?或者这是 iOS5 中的任何错误吗?

【问题讨论】:

  • 是没有调用-viewWillAppear的问题吗?还是没有显示模态窗口?
  • @gaige: YES -viewWillAppear 没有被调用
  • @Devang: 删除add.modalPresentationStyle = UIModalPresentationFormSheet;,它会调用 viewWillAppear 方法。请检查一下。
  • @Parth Bhatt :但我的代码在 iOS4.3 上运行良好,但不适用于 iOS 5.0。而且我不想显示整个屏幕。
  • 我会标记这个“ios5 兼容性”,但你只能有 5 个标记。

标签: iphone objective-c ios4 ios5


【解决方案1】:

-viewWillAppear 只保证在-viewWillDisappear 也被调用的地方被调用。对于 iPad 上的大多数模式窗口,情况并非如此,因为它们不会遮挡整个页面。

您的问题的解决方案将取决于您需要 -viewWillAppear 来做什么,但一般来说,您可能需要直接从您关闭模态视图控制器的同一位置拨打电话。

一种常见的机制,尤其是在您可能在其他地方使用相同模态视图的情况下,是给模态视图控制器一个委托,当视图即将消失时调用该委托。这将使您有机会从模态窗口中获取响应,甚至只是在委托视图中强制重新加载数据。

希望这会有所帮助。

【讨论】:

  • 你可以试试 [[self presentingViewController] viewWillAppear:YES];
  • @NJones 而您确实可以调用 viewWillAppear:我建议您这样做,因为它还有其他副作用(因为文档说明您必须调用 super)。
  • 我猜你的意思是你不会推荐它?
  • @NJones 是的,我的意思是我不建议调用它。尤其是 iPad 上的视图本身不会消失,因此也不会重新出现,它只是将其中的一部分遮住,然后再次显示。通过使用 viewWillAppear 发出解雇信号,您基本上覆盖了 viewWillAppear 以具有不同的含义,并且由于操作系统在此调用期间执行某些功能(由于超级实现),您可能会看到意想不到的后果。简而言之,如果您想知道模式消失了,请使用通知或委托。我的 0.02 美元
  • 我同意。委派是首选。只是说这是可能的解决方案。如果我认为是“那个”答案,我会把它作为答案而不是评论。
【解决方案2】:

iOS 5 确实将它们的调用更改为 viewWillAppearviewWillDisappear。例如,UIScrollViewviewWillDisappear 中的子视图(确切地说是View Controller's views)将在您将另一个视图控制器压入堆栈时被调用。然而,当视图控制器被弹出时,viewWillAppear 不会被调用。这些方法从未在 iOS 4 中的 UIScrollView 子视图上调用过。

这对我来说很奇怪。再加上无论发生什么,如果您可以依赖它在 iOS 4 中发生的情况,它在 iOS 5 中的工作方式应该不会有所不同。大多数时候,我不知道每个实例在哪个特定实例中被调用,我通常在区域编码中反复试验。如果它按我喜欢的方式工作,我会继续前进。然后 iOS 5 进来了,给所有东西扔了一个破坏球。

我也经历过UINavigationController's 视图是子视图,ViewController 被推送到导航控制器堆栈,viewWillAppear 在 iOS 4 中永远不会被调用,但在 iOS 5 中会被调用。看图.

【讨论】:

  • 无论谁投了反对票,请用 iOS 4 和 iOS 5 模拟器试试这个项目,并告诉我你在两个 sims 中都得到了断点......这是 FirstViewController.m 中的 NSLog 语句。 docs.google.com/…
【解决方案3】:

我遇到了同样的问题。 我发现 viewWillAppear 在关闭模式后不会被调用,但 viewDidAppear 是。所以就试试viewDidAppear吧。

【讨论】:

  • 在模态视图中,我添加了presentingViewController.viewDidAppear(true),然后它起作用了,但在那里添加了 updateUI()(私有函数)调用。
  • 它不起作用。而且它似乎从来没有可行过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2012-01-05
  • 2018-12-07
相关资源
最近更新 更多