【问题标题】:ViewControllers with TextViews in UIPageViewControllerUIPageViewController 中带有 TextViews 的 ViewControllers
【发布时间】:2013-02-21 01:38:47
【问题描述】:

我试图学习 UIPageViewControllers 并遇到了一个我无法解决的问题。 这是我试图做的:

  • 步骤:
    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

【问题讨论】:

  • 页面视图控制器允许您通过在一个边缘附近滑动或点击来翻页。我猜你正在点击左侧的轻击手势识别器。
  • 我不这么认为。请查看附加项目dl.dropbox.com/u/62559842/PageViewcontrollerTest.zip
  • 是的,我明白你的意思了。它与使用滚动过渡有关。如果你把它改成 curl,它的行为就正常了。
  • 是的,rdelmer,我之前尝试过,也有同样的疑问。但是,我必须为我正在进行的项目使用滚动动画。应该有一个解决方案,我找不到。无论如何,感谢您试一试。欣赏它。
  • 好吧,祝你好运,但我感觉这是 UIPageViewController 的另一个错误。我尝试延迟调用 textField becomeFirstResponder,这导致了相同的行为,甚至没有触摸屏幕。

标签: objective-c uiviewcontroller ios6 uitextview uipageviewcontroller


【解决方案1】:

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

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

我会尝试使用方法 swizzling 来阻止此消息,但这对于 AppStore 可能不合适。所以我尝试了其他方法。

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

This is a link to your project updated

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

试着告诉我

编辑:

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

直觉。

大量调试和堆栈跟踪让我认为问题与“嵌套 UIScrollView”系统中的错误以及从内部视图发送到其父视图的一些消息有关。

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

在简单的 UIView 中嵌入 UITextView 是不够的,因为 UIView 如果无法处理,会将消息转发到它的超级视图。 我想:UIScrollView 可能没有(否则嵌套 UIScrollView 并不简单),所以我尝试了它,它成功了。

这都是假设,因为我停止了检查,这周我将进行更深入的研究。

【讨论】:

  • 是的。有用。 :) 谢谢。无论如何,我不知道是什么导致你找到这个解决方案。再次感谢。
【解决方案2】:

构建目标 iOS-7.0。

滚动视图技巧对我不起作用。试图通过故事板和代码将文本视图嵌入到滚动视图中,但没有运气。

只需延迟对 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 上运行。尽管完全有可能使文本视图成为响应者的任何实现细节都可能花费比设定时间更长的时间。所以请记住,这并不完全是防弹的。

--编辑--

嗯...它正在我的 iPhone 4 打浆机上工作,延迟为 0.0000000000000001

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多