11

TextViews我努力学习UIPageViewController S和打击,我解决不了的问题。 这就是我试图做的:ViewControllers在UIPageViewController

  • 步骤:
    1. 我只是创造了2个视图控制器和 故事板页面视图控制器。
    2. 然后,我向文件所有者PageViewController添加了一些代码至 表现为自身的dataSourcedelegate
    3. 当我跑步时,事情运作良好。
    4. 我在第二个视图控制器中添加了一些按钮和文本字段。
    5. 我跑了,效果很好。
    6. 现在我添加了一个文本视图到第二个视图控制器并运行。当我试图在文本视图内写入内容时,页面控件抖动并移动到第一个视图控制器。

有没有人有过这样的经历?

@interface AMPageViewController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate> 

@end 

实施:

#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 

If you want to download and try the project

+0

页面视图控制器的延迟让您无论是滑动或轻敲接近一个边缘翻开新的一页。我猜你正在击中左侧的那个轻击手势识别器。 – rdelmar 2013-02-21 03:58:24

+0

我不这么认为。请看附件项目https://dl.dropbox.com/u/62559842/PageViewcontrollerTest.zip – Bavan 2013-02-21 04:19:15

+0

是的,我明白你的意思了。它与使用滚动转换有关。如果将其更改为卷曲,则表现正常。 – rdelmar 2013-02-21 04:47:53

回答

7

我调查研究了很多在这个问题上。 这似乎是一个与UIPageViewController的内部(私有)UIScrollView相关的错误。 如果你在StackOverflow上搜索,你会发现很多帖子有这个问题,并没有解决方案...

我似乎UITextView(这是一个UIScrollView和AFAIR,有一个内部的UIWebView)发送一些奇怪的消息它的超级链,使UIPageViewController的私人UIScrollView滚动到左上角。

我会试图阻止使用方法混写此消息,但是这可能是不正常的的AppStore。所以我尝试了其他的东西。

最终的解决方案非常简单:简单地说,将UITextView嵌入到UIScrollView中!

This is a link to your project updated

如果你这样做,你会解决这个问题!

尝试,让我知道

编辑:

我是如何得出这一解决方案:

一种直觉。

很多调试和堆栈跟踪不得不让我觉得现在的问题是有关的“嵌套UIScrollView的”系统错误从内以它的父发送一些信息。

的UITextView从继承的UIScrollView和内部具有UIWebDocumentView(私有)这是另一种的UIScrollView。在调试过程中,我看到很多消息(私有方法),例如发送到上层UIScrollView的“relayout superview”。所以,出于某种原因,内部滚动视图(UIWebDocumentView?)正在向它的超级视图发送消息/事件。这个消息/事件(可能是因为一个bug)并没有停止到外部的UITextView,而是被转发到由UIPageViewController处理的UIScrollView。

中嵌入的UITextView一个简单的UIView内是不够的,因为UIView的将消息转发到它的上海华盈,如果它不能处理。 心想:UIScrollView的可能没有(否则就不能简单地窝UIScrollViews),所以我想和它的工作。

这毕竟是一个假设,因为我停下来检查,我将在本周有了更深入的了解。

+0

是的。有用。 :) 谢谢。无论如何,我不知道是什么导致你找到这个解决方案。再次感谢。 – Bavan 2013-05-06 03:18:05

+0

我加了一些细节:-) – LombaX 2013-05-06 08:06:24

0

你之前没有设置和视图控制器后,也来看一下,第一个响应者socController

1

构建目标iOS-7.0。

scrollview技巧不适合我。试图通过故事板和代码在scrollview中嵌入textview,但没有运气。

仅延迟调用TextView的做到了。不是很优雅,但它是我迄今为止唯一能够工作的东西。

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self.textView becomeFirstResponder]; 
    }); 
} 

经过测试,在我的iPhone 5和我的超低速iPhone4上工作。尽管无论实现细节如何使textview成为响应者都可能花费比设定时间更长的时间,但完全有可能。所以请记住,这不完全是防弹。

- 编辑 -

嗯......它的工作在我的iPhone 4打浆机与0.0000000000000001