14

我正在潜入 iOS 开发,我正在构建一个益智游戏来帮助我熟悉这个平台。我让 AdWhirl 在用户完成拼图时显示的分数屏幕中显示广告。问题是,分数屏幕视图控制器请求和接收广告至少需要几秒钟,在此期间用户查看分数并移动到不同的视图。我计划实现一个动画,当用户解决一个难题时发生,动画完成所花费的时间将是请求和接收将在下一个(分数)视图中显示的广告的好时机用户也会被带走。

在解谜动画发生期间,如何预加载下一个视图控制器,以便在将视图控制器推送到导航堆栈时出现广告?如果这是不可能的,或者如果这是一个坏主意,您对我如何在动画播放期间请求和接收广告有什么建议吗?

非常感谢您的智慧!

注意:对于不熟悉 AdWhirl 的人来说,请求和接收广告的过程很简单。在您希望广告出现的视图控制器的 viewDidLoad 方法中,您创建一个 AdWhirlView(UIView 的子类),将其添加为子视图,然后调用请求广告的方法。当广告到达时,它会调用一个委托方法将其显示在父视图中。

4

6 回答 6

31

使用 [viewController loadView]有一个副作用,即在视图加载后不会自动调用 viewDidLoad。

要正确执行此操作并确保调用 viewDidLoad,而不是自己调用 loadView,您可以使用实例化 UIViewController 的视图

  UIView *view = myViewController.view;

或者

  UIView *view = [myViewController view];

这将调用 loadView (如果视图尚未加载),然后在视图完成加载时调用 viewDidLoad。

于 2012-04-17T12:15:07.067 回答
15

为了响应接受的答案,您不得手动调用 -loadView。从文档中:

你不应该直接调用这个方法。视图控制器在其视图属性被请求但当前为 nil 时调用此方法。此方法加载或创建视图并将其分配给视图属性。

相反,您应该只调用 [myViewController view] 来触发视图加载。

与往常一样,阅读文档!

于 2012-04-17T12:33:07.053 回答
2

把这个放在你的代表身上application:didFinishLaunchingWithOptions:

  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
                   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:[NSBundle mainBundle]];
                   [storyboard instantiateViewControllerWithIdentifier: @"TheViewControllerYouWantToPreload"];
                 });

dispatch_async将使整个事情在后台加载。

于 2016-06-10T14:52:42.043 回答
1

在 iOS 9 中添加了一个新方法loadViewIfNeeded()。我相信它最初是用于视图控制器的单元测试,但它也应该适用于这种情况。

于 2017-04-18T02:33:25.230 回答
0

iOS 5 及更高版本提供了两个功能。

  • setNeedsLayout()
  • 布局如果需要()

调用setNeedsLayout()就像告诉系统您要更新被调用视图和子视图的布局并重绘它们。更改不会立即反映出来。顾名思义,它只是设置标记并将其反映在调度中。仅当返回下一个更新周期时,更改才能反映在视图中。

重要的是,调用此方法引起的任务是异步执行的。因此,开发人员不知道更新周期何时会体现变化。

另一方面,layoutIfNeeded()是同步调用。他们要求系统立即反映这些变化。顾名思义,布局是立即完成的。因此,在调用此方法后返回时间控件时,更改已经反映在视图中。

于 2019-12-09T05:17:23.637 回答
-3

你可以手动调用loadView,我不知道有没有副作用,但我不这么认为。

谢谢 Tommy,确实,访问视图属性确保 loadView 仅在视图层次结构尚未加载时才会被有效调用,如果 loadView 代码确实注意处理它,则避免任何潜在的泄漏。

于 2010-12-19T19:04:27.867 回答