在UIPageViewController中使用TextViews的ViewControllers

时间:2013-02-21 01:38:47

标签: objective-c uiviewcontroller ios6 uitextview uipageviewcontroller

我试图学习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

3 个答案:

答案 0 :(得分: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?)正在向其超级视图发送消息/事件。此消息/事件(可能是因为一个错误)没有停止到外部UITextView,而是被转发到UIPageViewController处理的UIScrollView。

将UITextView嵌入到一个简单的UIView中是不够的,因为如果它无法处理,UIView会将消息转发给它的superview。 我想:UIScrollView 可能没有(否则嵌套UIScrollViews并不简单),所以我尝试了它的工作原理。

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

答案 1 :(得分:1)

构建目标iOS-7.0。

滚动视图技巧对我不起作用。试图通过故事板和代码将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

答案 2 :(得分:0)

您没有在视图控制器之前和之后设置,也查看了第一个响应者的socController