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