如何完全解雇UIPageViewController?
我遵循了本教程http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/
为我的应用制作入门UIPageViewController。它有6张幻灯片,大部分都可以使用。但是,我的应用程序嵌入在导航控制器中,我只想让幻灯片显示我的应用程序的演练。本教程以编程方式实例化新的UIPageViewController,但我已经使用了界面构建器来处理不属于教程一部分的应用程序部分。当我使用调用:
的按钮关闭UIPageViewController时[self willMoveToParentViewController:nil]; //these three have been used in a variety of ways
[self.view removeFromSuperview];
[self removeFromParentViewController];
我返回主页但点仍然存在。主导航控制器有一个tableview作为其第一页,我无法访问didSelectRow方法。我认为问题围绕着如何创建视图(一个在界面构建器中,一个以编程方式),但是当我查看文档时,我仍然无法找到我正在寻找的内容。
我已经在这里待了几天,所以任何帮助都会很精彩。 github在这里:https://github.com/iOSDevClass/WeighFit
这应该只是tableViewController(可在左侧查看)。右边的东西是UIPageViewController上用于滑动教程解释的背景图片。 dismiss按钮(部分可见)适用于UIPageViewController,导航栏适用于此状态下的tableViewController。
界面构建器如下所示:
以下是一些注释:
- superview in contentVC is currently null, how to set a superview and switch to it
- navigation bar works in dismissed state, but the content area holds the PageContentViewController in memory
- they both have the same storyboard
- they both have the same window
- root view is the same navigation controller
- all carry only one child view controller: DayListTableViewController
- both have the same window level and screen
- have the same containerview
- Day list is a UITableView and PageContent is a UIView for their views
-what does didMoveToParentViewController subclass and what does it do?
-UIViewController
-In 'responding to containment events': Called after the view controller is added or removed from a container view controller.
-is the object graph what stays in the content area?
-views (in general) can receive touch events
-if your nib file is not associated with a view controller, you can load the nib file contents manually using an NSBundle or UINib object, which use the data in the nib file to reconstitute your view objects.
-there is a difference between adding a child view controller (via navigation controller) and a subview (on a UIView)
-could tag the view to return to it later
-convert between different coordinate systems
-If you do not retain the view before the next event loop cycle, the view will be released.
-there are two phantom screens to the left and right, the buttons on the phantom objects work
我将此代码连接到我在初始视图控制器中按下的按钮:
-(void) initializeWalkthrough
{
//The final step is to create and initialize the UIPageViewController.
// Create the data model
_pageTitles = @[@"Over 200 Tips and Tricks", @"Discover Hidden Features", @"Bookmark Favorite Tip", @"Free Regular Update"];
_pageImages = @[@"WeighFitLogo.png", @"dayList.png", @"mealRecorder.png", @"daySetup.png"];
// Create page view controller
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; // We first create the PageViewController instance.
// The ID is used as reference for creating the view controller instance. To instantiate a view controller in storyboard, you can use the instantiateViewControllerWithIdentifier: method with a specific storyboard ID.
self.pageViewController.dataSource = self; // Next we specify the data source, in this case it is the class itself.
PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
// Change the size of page view controller
self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30); //Lastly, we change the size of the page view controller and add the page controller view to the current view.
[self addChildViewController:_pageViewController];
[self.view addSubview:_pageViewController.view]; //this is the line that transitions to a new view
[self.pageViewController didMoveToParentViewController:self];}
#pragma mark - Page View Controller Data Source //
/*
We simply tell iOS that we have the total number of pages to display in the page view controller and the first page should be selected by default.
*/
//It is a helper method that is designed to create the page content view controller on demand. It takes in the index parameter and creates the corresponding page content controller.
- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
return nil;
}
// Create a new view controller and pass suitable data.
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.imageFile = self.pageImages[index];
pageContentViewController.titleText = self.pageTitles[index];
pageContentViewController.pageIndex = index;
return pageContentViewController;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController*) viewController).pageIndex; //we get the current page index
if (index == NSNotFound) { //Depending the method, we simply increase/decrease the index number and return the view controller to display.
return nil;
}
index++;
if (index == [self.pageTitles count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}
//To display a page indicator, you have to tell iOS the number of pages (i.e. dots) to display in the page view controller and which page must be selected at the beginning. Add the following two methods at the end of the ViewController.m file:
(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
return [self.pageTitles count];
}
(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{return 0;
}
当我在NSLogged中找到我能找到的所有相关属性时,这是我的控制台输出。
Dayslist = TableViewController
PageViewContent = UIPageViewController
事件的顺序是
:
***** DayList begin *****
before interactions start
[self.view superview]: <UIViewControllerWrapperView: 0x175b2960; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x175ab8f0>>
self.storyboard: <UIStoryboard: 0x1768caf0>
self.view: <UITableView: 0x17999400; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; tintColor = UIDeviceRGBColorSpace 0.286275 0.376471 0.917647 1; gestureRecognizers = <NSArray: 0x176a0fe0>; layer = <CALayer: 0x176876f0>; contentOffset: {0, -64}; contentSize: {320, 512}>
self.view.subviews: (
"<UITableViewWrapperView: 0x1819e800; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x176a46c0>; layer = <CALayer: 0x1768a3a0>; contentOffset: {0, 0}; contentSize: {320, 568}>",
"<UIRefreshControl: 0x175afcb0; frame = (0 0; 320 60); hidden = YES; autoresize = W; layer = <CALayer: 0x175aead0>>",
"<UIImageView: 0x176a29c0; frame = (3 498.5; 314 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x17674290>>",
"<UIImageView: 0x176765c0; frame = (314.5 3; 2.5 491); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x176766a0>>"
)
self.view.superview: <UIViewControllerWrapperView: 0x175b2960; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x175ab8f0>>
self.view.layer: <CALayer: 0x176876f0>
[self.view window]: <UIWindow: 0x175a5a30; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x1759e910>; layer = <UIWindowLayer: 0x1759d0e0>>
[self.view window].rootViewController: <NavigationController: 0x1819f000>
[self.view window].windowLevel: 0.000000
[self.view window].screen: <UIScreen: 0x17572430; bounds = {{0, 0}, {320, 568}}; mode = <UIScreenMode: 0x1756d380; size = 640.000000 x 1136.000000>>
[self.view window].keyWindow:
[self.navigationController view]: <UILayoutContainerView: 0x175a9a00; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x1769c790>; layer = <CALayer: 0x175aa0a0>>
[self.navigationController childViewControllers]: (
"<DayListTableViewController: 0x17690fb0>"
)
before interactions end
after interactions start
[self.view superview]: <UIViewControllerWrapperView: 0x175b2960; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x175ab8f0>>
self.storyboard: <UIStoryboard: 0x1768caf0>
self.view: <UITableView: 0x17999400; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; tintColor = UIDeviceRGBColorSpace 0.286275 0.376471 0.917647 1; tag = 1; gestureRecognizers = <NSArray: 0x176a0fe0>; layer = <CALayer: 0x176876f0>; contentOffset: {0, -64}; contentSize: {320, 512}>
self.view.subviews: (
"<UITableViewWrapperView: 0x1819e800; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x176a46c0>; layer = <CALayer: 0x1768a3a0>; contentOffset: {0, 0}; contentSize: {320, 568}>",
"<UIRefreshControl: 0x175afcb0; frame = (0 0; 320 60); hidden = YES; autoresize = W; layer = <CALayer: 0x175aead0>>",
"<UIImageView: 0x176a29c0; frame = (3 498.5; 314 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x17674290>>",
"<UIImageView: 0x176765c0; frame = (314.5 3; 2.5 491); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x176766a0>>",
"<_UIPageViewControllerContentView: 0x175d1b10; frame = (0 0; 320 538); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x175d1a30>>"
)
self.view.superview: <UIViewControllerWrapperView: 0x175b2960; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x175ab8f0>>
self.view.layer: <CALayer: 0x176876f0>
[self.view window]: <UIWindow: 0x175a5a30; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x1759e910>; layer = <UIWindowLayer: 0x1759d0e0>>
[self.view window].rootViewController: <NavigationController: 0x1819f000>
[self.view window].windowLevel: 0.000000
[self.view window].screen: <UIScreen: 0x17572430; bounds = {{0, 0}, {320, 568}}; mode = <UIScreenMode: 0x1756d380; size = 640.000000 x 1136.000000>>
[self.view window].keyWindow:
[self.navigationController view]: <UILayoutContainerView: 0x175a9a00; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x1769c790>; layer = <CALayer: 0x175aa0a0>>
[self.navigationController childViewControllers]: (
"<DayListTableViewController: 0x17690fb0>"
)
after interactions end
^^^^^ DayList end ^^^^^
***** Pageview Content begin *****
before interactions start
[self.view superview]: <UIView: 0x176bc540; frame = (320 0; 320 501); layer = <CALayer: 0x176bc600>>
self.storyboard: <UIStoryboard: 0x1768caf0>
self.view: <UIView: 0x175b5770; frame = (0 0; 320 501); autoresize = W+H; tintColor = UIDeviceRGBColorSpace 0.286275 0.376471 0.917647 1; layer = <CALayer: 0x175d3450>>
self.view.subviews: (
"<UIImageView: 0x175894c0; frame = (16 0; 288 501); opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x175d3270>>",
"<UILabel: 0x175c17a0; frame = (76 44; 169 20.5); text = 'Over 200 Tips and Tricks'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x175c63c0>>",
"<UIButton: 0x175a0f70; frame = (124 451; 72 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x1756de70>>",
"<_UILayoutGuide: 0x175c4d30; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x175c0c90>>",
"<_UILayoutGuide: 0x17579bb0; frame = (0 501; 0 0); hidden = YES; layer = <CALayer: 0x175cb910>>"
)
self.view.superview: <UIView: 0x176bc540; frame = (320 0; 320 501); layer = <CALayer: 0x176bc600>>
self.view.layer: <CALayer: 0x175d3450>
[self.view window]: <UIWindow: 0x175a5a30; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x1759e910>; layer = <UIWindowLayer: 0x1759d0e0>>
[self.view window].rootViewController: <NavigationController: 0x1819f000>
[self.view window].windowLevel: 0.000000
[self.view window].screen: <UIScreen: 0x17572430; bounds = {{0, 0}, {320, 568}}; mode = <UIScreenMode: 0x1756d380; size = 640.000000 x 1136.000000>>
[self.view window].keyWindow:
[[self.view superview] superview]: <_UIQueuingScrollView: 0x181c0200; frame = (0 0; 320 501); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x176bb6a0>; layer = <CALayer: 0x176bb280>; contentOffset: {320, 0}; contentSize: {960, 501}>
[self.navigationController view]: <UILayoutContainerView: 0x175a9a00; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x1769c790>; layer = <CALayer: 0x175aa0a0>>
[self.navigationController childViewControllers]: (
"<DayListTableViewController: 0x17690fb0>"
)
before interactions end
^^^^^ Pageview Content end ^^^^^
after interactions start
[self.view superview]: (null)
self.storyboard: <UIStoryboard: 0x1768caf0>
self.view: <UIView: 0x175b5770; frame = (-1160 -1250.5; 320 501); alpha = 0; hidden = YES; autoresize = W+H; userInteractionEnabled = NO; tintColor = UIDeviceRGBColorSpace 0.286275 0.376471 0.917647 1; tag = 2; layer = <CALayer: 0x175d3450>>
self.view.subviews: (
"<UIImageView: 0x175894c0; frame = (16 0; 288 501); opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x175d3270>>",
"<UILabel: 0x175c17a0; frame = (76 44; 169 20.5); text = 'Over 200 Tips and Tricks'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x175c63c0>>",
"<UIButton: 0x175a0f70; frame = (124 451; 72 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x1756de70>>",
"<_UILayoutGuide: 0x175c4d30; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x175c0c90>>",
"<_UILayoutGuide: 0x17579bb0; frame = (0 501; 0 0); hidden = YES; layer = <CALayer: 0x175cb910>>"
)
self.view.superview: (null)
self.view.layer: <CALayer: 0x175d3450>
[self.view window]: (null)
[self.view window].rootViewController: (null)
[self.view window].windowLevel: 0.000000
[self.view window].screen: (null)
[self.view window].keyWindow:
[[self.view superview] superview]: (null)
[self.navigationController view]: <UILayoutContainerView: 0x175a9a00; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x1769c790>; layer = <CALayer: 0x175aa0a0>>
[self.navigationController childViewControllers]: (
"<DayListTableViewController: 0x17690fb0>"
)
after interactions end
着名的互动&#39;包括:
self.navigationController.navigationBarHidden = NO;
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
[self.navigationController popViewControllerAnimated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
[self.view sendSubviewToBack:self.view];
self.view.hidden = YES;
self.view.alpha = 0.0;
self.view.tag = 2;
self.view.userInteractionEnabled = NO;
self.view.center = CGPointMake(-1000,-1000);
[[self.view window] resignKeyWindow];
[self.view resignFirstResponder];
[self.storyboard instantiateInitialViewController];
[self.view setNeedsDisplay];
[self.view removeFromSuperview];
[self.view viewWithTag:1];