ViewControllers с TextViews в UIPageViewController

Я пытался узнать UIPageViewControllers и попал в проблему, которую я не мог решить. Вот что я пытался сделать:--7-->

  • шагов:
    1. Я просто создал 2 контроллера вида и контроллер вида страницы в раскадровка.
    2. затем я добавил код к владельцу файла PageViewController в ведите себя как dataSource и delegate для себя.
    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

если вы хотите скачать и попробовать проект

3 ответов


Я много исследовал эту проблему. Кажется, это ошибка, связанная с внутренним (частным) UIScrollView UIPageViewController. Если вы ищете в StackOverflow, вы найдете много сообщений с этой проблемой и никаких решений...

Мне кажется, что UITextView (который является UIScrollView и, AFAIR, имеет внутренний UIWebView), отправляет какое-то странное сообщение в цепочку superviews, что делает частный UIScrollView uipageviewcontroller прокруткой в верхний левый угол.

Я бы попытался заблокировать это сообщение с помощью метода swizzling, но это, вероятно, не нормально для AppStore. Поэтому я попробовал другие вещи.

окончательное решение очень простое: просто вставьте UITextView внутри UIScrollView!

это ссылка на ваш проект обновляется!--12-->

Если вы это сделаете, вы решите проблему!

попробуйте и дайте мне знать

EDIT:

Как я придите к этому решению:

интуиция.

много трассировок отладки и стека заставили меня подумать, что проблема связана с ошибкой в системе "вложенность UIScrollView" и некоторыми сообщениями, отправленными из внутреннего вида в его супервизор.

UITextView наследуется от UIScrollView и имеет внутри uiwebdocumentview (private), который является другим UIScrollView. Во время отладки я видел много сообщений (частных методов), таких как "relayout superview", отправленных в верхний UIScrollView. Итак, по какой-то причине внутренний вид прокрутки (UIWebDocumentView?) отправлял сообщение / событие в его superview. Это сообщение / событие (возможно, из-за ошибки) не останавливалось во внешнем UITextView и было перенаправлено в UIScrollView, обработанный UIPageViewController.

встраивание UITextView внутри простого UIView было недостаточно,потому что UIView пересылает сообщение в superview, если оно не может обрабатывать. Я подумал: UIScrollView наверное не делает (иначе было бы не просто вложить UIScrollViews), поэтому я попытался, и это сработало.

Это все предположения, потому что я перестал проверять, у меня будет больше на этой неделе.


построить целевой iOS-7.0.

трюк scrollview не работал для меня. Пытался встроить textview в scrollview через раскадровку и код, но не повезло.

просто отложив вызов 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 стать ответчик может занять больше времени. Так что имейте в виду, это не совсем пуленепробиваемый.

-- EDIT--

хорошо... он работает на моем iPhone 4 beater с задержкой 0.0000000000000001


вы не установили до и после контроллеров просмотра, а также заглянули в первый ответчик для socController