UIPageviewController 使用 Storyboard 崩溃
Posted
技术标签:
【中文标题】UIPageviewController 使用 Storyboard 崩溃【英文标题】:UIPageviewController using Storyboard crash 【发布时间】:2013-12-18 06:40:34 【问题描述】:我将使用 UIPageViewController 制作一个教程页面。
但是发生了崩溃。我找不到发生崩溃的点。
我正在尝试直接使用 UIPageViwController,而不是在 UIViewController 中使用。
数据源有效。但是当尝试调用 [self setViewControllers:@[pageZero] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; ,发生如下错误。
UserGuidePageViewController 链接到右舷的 UIPagveViewController 框架。
下面是标题
#import <UIKit/UIKit.h>
@interface UserGuidePageViewController : UIPageViewController <UIPageViewControllerDataSource>
@end
以下是代码
#import "UserGuidePageViewController.h"
#import "UserGuideViewController.h"
@interface UserGuidePageViewController ()
@property (nonatomic, retain) NSArray *array;
@end
@implementation UserGuidePageViewController
- (id)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
self.dataSource = self;
return self;
- (UserGuideViewController *)userGuideViewForPageIndex:(NSUInteger)pageIndex
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UserGuideViewController *targetViewController = [storyboard instantiateViewControllerWithIdentifier:@"UserGuideViewController"];
return targetViewController;
- (void)viewDidLoad
[super viewDidLoad];
UserGuideViewController *pageZero = [self userGuideViewForPageIndex:0];
[self setViewControllers:@[pageZero] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
--> Crash happened here!!!
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
#pragma mark - Page View Controller Data Source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
NSUInteger index = [(UserGuideViewController *)viewController pageIndex];
return [self userGuideViewForPageIndex:(index - 1)];
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
NSUInteger index = [(UserGuideViewController *)viewController pageIndex];
return [self userGuideViewForPageIndex:(index + 1)];
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
// The number of items reflected in the page indicator.
return 1;
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
// The selected item reflected in the page indicator.
return 0;
错误如下。
*** Assertion failure in -[_UIQueuingScrollView setView:direction:animated:completion:], /SourceCache/UIKit/UIKit-2903.23/_UIQueuingScrollView.m:671
2013-12-18 15:23:35.779 Natural Calendar[4497:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: view'
*** First throw call stack:
(0x30ef6f4b 0x3b6d36af 0x30ef6e25 0x3189efe3 0x33ba3321 0x33b382eb 0x33b38407 0xf4715 0x3366e37b 0x3366e139 0xf0c45 0x1062d9 0x1106c3 0x3369e713 0x3369e6b3 0x3369e691 0x3368a11f 0x3369e107 0x3369ddd9 0x33698e65 0x3366e79d 0x3366cfa3 0x30ec2183 0x30ec1653 0x30ebfe47 0x30e2ac27 0x30e2aa0b 0x35b0b283 0x336ce049 0xecd09 0x3bbdbab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
其实我改成Xcode模板样式了。
但是也出现了这个错误。
- (void)viewDidLoad
[super viewDidLoad];
_pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
[_pageViewController setDataSource:self];
UserGuideViewController *pageZero = [self userGuideViewForPageIndex:0];
[_pageViewController setViewControllers:@[pageZero] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
[self addChildViewController:_pageViewController];
[self.view addSubview:[_pageViewController view]];
CGRect pageViewRect = self.view.bounds;
//pageViewRect = CGRectInset(pageViewRect, 40.0, 40.0);
_pageViewController.view.frame = pageViewRect;
[_pageViewController didMoveToParentViewController:self];
我不知道有什么问题。选择UIPageViewControllerTransitionStyleScroll时出现错误。选择UIPageViewControllerTransitionStylePageCurl时,没有报错。
【问题讨论】:
您还应该将您的捆绑包从 nil 更改为[NSBundle mainBundle]
我认为编辑:抱歉,如果您指定 nil,请阅读文档,它会自动在 mainBundle 中查找情节提要
【参考方案1】:
@interface UserGuidePageViewController : UIPageViewController <UIPageViewControllerDataSource>
将这一行改为
@interface UserGuidePageViewController : UIViewController <UIPageViewControllerDataSource>
意味着您可以为此使用 UIViewcontroller
请参阅this 链接以供参考。
还有另一个link,它用于故事板。
【讨论】:
只有使用 UIViewController 的方法吗?我检查了新项目中的模板代码。我正在尝试使用 UIPageViewController,因为它似乎使用 UIPageViewController 而没有声明 UIPageViewController 的属性。 这个link 似乎可以直接扩展 UIPageViewController 但它还有另一个问题。 对不起,我没有像扩展 uipageviewcontroller 那样使用它。【参考方案2】:我发现loadView()
在页面ContentViewController
上声明。但是,loadView()
仍然为空,无需调用 [super loadView];
。因此,视图将保持为nil
。
现在它似乎在删除方法 loadView()
后可以工作。
【讨论】:
以上是关于UIPageviewController 使用 Storyboard 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
当兄弟是 UIPageViewController 时,UITableView 没有动画
UIPageViewController iOS 的下一页按钮
UIPageViewController 的视图框架在 iOS 上是不可预测的
我能以某种方式从 UIPageViewController 获取 scrollViewDidScroll: UIScrollView Delegate 方法吗?