iOS-预加载页面视图控制器及其子视图控制器

iOS-预加载页面视图控制器及其子视图控制器,ios,objective-c,Ios,Objective C,当我的应用程序的选项卡视图加载时,我也尝试加载一个页面视图控制器,并在应用程序的生命周期中将其保存在内存中。页面视图是我的self.playerQueueViewController -(void)viewDidLoad{ [super viewDidLoad]; self.playerQueueViewController = [[UIStoryboard storyboardWithName:@"MusicPlayerQueue" bundle:nil] instantiateIni

当我的应用程序的选项卡视图加载时,我也尝试加载一个页面视图控制器,并在应用程序的生命周期中将其保存在内存中。页面视图是我的self.playerQueueViewController

-(void)viewDidLoad{
   [super viewDidLoad];
 self.playerQueueViewController = [[UIStoryboard storyboardWithName:@"MusicPlayerQueue" bundle:nil] instantiateInitialViewController];
    self.playerQueueViewController.transitioningDelegate = self;
    self.playerQueueViewController.modalPresentationStyle = UIModalPresentationCustom;
}
现在,视图只在我调用时加载

-(void)centerButtonPressed:(id)sender
{
    [self presentViewController:self.playerQueueViewController animated:YES completion:nil];
}
如何让视图在tabViewController加载后立即加载并加载页面视图控制器的子视图控制器?我正在尝试将所有这些视图控制器保存在内存中

下面是我如何设置pageViewController的

当前发生的情况是,仅当我以-(void)centerButtonPressed的方式呈现pageViewController时,才会加载它。当我调用-(void)goToPrevious,-(void)goToNext时,子视图被加载

更新:

我现在可以像这样加载pageViewController的页面视图和初始子视图。问题是我无法在初始加载时加载第二个子视图控制器

所有这些代码都在我的选项卡ViewController的viewDidLoad中

self.pageRootViewController = [[UIStoryboard storyboardWithName:@"MusicPlayerQueue" bundle:nil] instantiateInitialViewController];
self.pageRootViewController.transitioningDelegate = self;
self.pageRootViewController.modalPresentationStyle = UIModalPresentationCustom;


UIPageViewController *pageViewController = self.pageRootViewController.pageViewController;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MusicPlayerQueue" bundle:nil];
pageViewController = [storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
self.queueViewController = [storyboard instantiateViewControllerWithIdentifier:@"Queue"];
self.queueViewController.rootViewController = self.pageRootViewController;
self.playerViewController = [storyboard instantiateViewControllerWithIdentifier:@"Player"];
self.playerViewController.rootViewController = self.pageRootViewController;

// Add the page view controller to this root view controller.
[self.pageRootViewController addChildViewController:pageViewController];
[self.pageRootViewController.view addSubview:pageViewController.view];
[pageViewController didMoveToParentViewController:self.pageRootViewController];
[self.pageRootViewController.view bringSubviewToFront:self.pageRootViewController.dismissArrowButton];

// Instantiate the first view controller.

[pageViewController setViewControllers:@[self.playerViewController, self.queueViewController]
                            direction:UIPageViewControllerNavigationDirectionReverse
                                   animated:NO
                                 completion:^(BOOL finished) {
                                     // Completion code
                                 }];
更新2:

好的,我的代码正是我想要的。但是,我不确定这是否是解决此问题的最佳方法。看起来不错。我唯一不喜欢的就是调用
[self.queueViewController视图]

在tabBarController的viewDidLoad中

   self.pageRootViewController = [[UIStoryboard storyboardWithName:@"MusicPlayerQueue" bundle:nil] instantiateInitialViewController];
    self.pageRootViewController.transitioningDelegate = self;
    self.pageRootViewController.modalPresentationStyle = UIModalPresentationCustom;


    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MusicPlayerQueue" bundle:nil];
    UIPageViewController *pageViewController = [storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageRootViewController.pageViewController = pageViewController;
    self.queueViewController = [storyboard instantiateViewControllerWithIdentifier:@"Queue"];
    self.queueViewController.rootViewController = self.pageRootViewController;
    [self.queueViewController view];
    self.playerViewController = [storyboard instantiateViewControllerWithIdentifier:@"Player"];
    self.playerViewController.rootViewController = self.pageRootViewController;

    self.pageRootViewController.queueViewController = self.queueViewController;
    self.pageRootViewController.playerViewController = self.playerViewController;

    // Add the page view controller to this root view controller.
    [self.pageRootViewController addChildViewController:pageViewController];
    [self.pageRootViewController.view addSubview:pageViewController.view];
    [pageViewController didMoveToParentViewController:self.pageRootViewController];
    [self.pageRootViewController.view bringSubviewToFront:self.pageRootViewController.dismissArrowButton];

    // Instantiate the first view controller.

    [pageViewController setViewControllers:@[self.playerViewController]
                                direction:UIPageViewControllerNavigationDirectionReverse
                                       animated:NO
                                     completion:^(BOOL finished) {
                                         // Completion code
                                     }];

一种方法是访问viewcontroller的视图框架,这感觉像是一种黑客攻击,但很有效

CGRect dontCareRect = myNewViewController.view.frame

这将强制加载vc的视图。

如果确实需要预加载,请在ViewController上调用.view,这将强制加载


不必预先加载视图。您可以设置子视图加载的动画,以增强用户体验并保持性能。

当我的tabViewController加载时,我需要向通知中心添加观察者。这将扩展到更大的体系结构决策中,但似乎您最好将观察者和数据提取移动到另一个对象中。可以根据需要传递此对象。ViewController应该是轻量级的。需要加载整个应用程序对象图、在不可见的视图上设置观察者等,这是一种糟糕的设计。因为你可以看到,这会导致奇怪的依赖关系和黑客行为,这只会使扩展项目更加困难。如果您使用web服务,请将其集中,允许通过视图控制器可以使用的干净界面访问它。好的,这更有意义。您应该独立于VC构建队列。例如,为玩家首选项等创建NSObject。您可以将队列存储在其中。然后,这个NSObject可以传递给VC需要的任何对象,或者做成一个单例(这不是一个坏模式,除非它被滥用,比如Notifications:/),这样这个PlayerPreferences对象可以有一个方法enQueueTrackId:和另一个名为getQueue的方法:你的一个VC可以调用enQueueTrackId:向它添加歌曲,然后在它出现时调用tableVC,可以调用getQueue并使用ID从CoreData加载曲目。文本已用完。因此,您开始将所有这些特定于播放器的数据集中到一个对象中,这样您就可以在将来自由地扩展和更改VCs。如果添加了需要首选项中某些内容的新VCs,则扩展PlayerPreferences对象并向其添加接口或协议。那么VC就可以使用它了。始终记住让对象承担其责任。然后,您可以轻松地测试代码、扩展和重用代码等。您可以对索引使用NSUserDefaults,将其保存在ViewWilldisDisplay中,并在滚动到该索引之前加载ViewWilldisDisplay。不要把单身汉变成垃圾场:)
CGRect dontCareRect = myNewViewController.view.frame