Подтвердить что ты не робот

ViewControllers с TextViews в UIPageViewController

Я пытался узнать UIPageViewController и ударил проблему, которую я не мог решить. Это то, что я пытался сделать:

  • Шаги:
    • Я просто создал 2 контроллера вида и контроллер просмотра страниц в StoryBoard.
    • Затем я добавил код владельцу файла PageViewController к ведут себя как dataSource и delegate к себе.
    • Когда я бежал, все работало хорошо.
    • Я добавил несколько кнопок и текстовые поля ко второму контроллеру представления.
    • Я побежал, работал хорошо.
    • Теперь я добавил текстовое представление ко второму контроллеру представления и запустил его. Когда я попытался написать что-то внутри текстового представления, управление страницей дрожало и перемещалось к первому виду контроллера.

Кто-нибудь испытывает это когда-либо?

@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

Если вы хотите загрузить и попробовать проект

4b9b3361

Ответ 1

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

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

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

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

Это ссылка на ваш проект обновлена ​​

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

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

EDIT:

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

Интуиция.

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

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

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

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

Ответ 2

Создайте целевой iOS-7.0.

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

- EDIT -

Ну... он работает на моем iPhone 4-битера с задержкой 0.0000000000000001

Ответ 3

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