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
Если вы хотите загрузить и попробовать проект
Ответы
Ответ 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