Bav*_*van 11 objective-c uitextview uiviewcontroller uipageviewcontroller ios6
我试图学习UIPageViewController
s并找到一个我无法解决的问题.这就是我试图做的事情:
PageViewController
表现为一个dataSource
和delegate
自己.有没有人经历过这个?
@interface AMPageViewController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate>
@end
Run Code Online (Sandbox Code Playgroud)
实施:
#import "AMPageViewController.h"
@interface AMPageViewController ()
{
UIViewController *mainController;
UIViewController* socController;
}
@end
@implementation AMPageViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
mainController = (UIViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"First"];
socController = (UIViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"Second"];
[self setViewControllers:@[mainController]
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
self.dataSource = self;
self.delegate = self;
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if (viewController == socController )
return mainController;
else return nil;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if (viewController == mainController )
return socController;
else return nil;
}
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
return 2;
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
return 0;
}
@end
Run Code Online (Sandbox Code Playgroud)
我对这个问题进行了很多调查.这似乎是与UIPageViewController的内部(私有)UIScrollView相关的错误.如果您在StackOverflow上搜索,您会发现很多帖子都有这个问题并且没有解决方案......
我似乎UITextView(它是一个UIScrollView和AFAIR,有一个内部UIWebView),向它的超级视图链发送一些奇怪的消息,这使得UIPageViewController的私有UIScrollView滚动到左上角.
我本来试图使用方法调配阻止此消息,但这可能不适用于AppStore.所以我尝试了其他的东西.
最终的解决方案非常简单:只需将UITextView嵌入UIScrollView即可!
如果你这样做,你就能解决问题!
试试让我知道
编辑:
我是如何达成这个解决方案的:
直觉.
许多调试和堆栈跟踪让我觉得问题与"嵌套UIScrollView"系统中的错误以及从内部视图发送到其superview的一些消息有关.
UITextView继承自UIScrollView,并在UIWebDocumentView(私有)内部,这是另一个UIScrollView.在调试期间,我看到很多消息(私有方法),例如发送到UIScrollView上层的"relayout superview".因此,由于某种原因,内部滚动视图(UIWebDocumentView?)正在向其超级视图发送消息/事件.此消息/事件(可能是因为一个错误)没有停止到外部UITextView,并被转发到由UIPageViewController处理的UIScrollView.
将UITextView嵌入到一个简单的UIView中是不够的,因为如果它无法处理,UIView会将消息转发给它的superview.我想:UIScrollView 可能没有(否则嵌套UIScrollViews并不简单),所以我尝试了它的工作原理.
这完全是一个假设,因为我停止了检查,本周我将有更深入的了解.