Domanda ViewControllers con TextViews in UIPageViewController


Stavo cercando di imparare UIPageViewControllers e ha colpito un problema che non ho potuto risolvere. Questo è quello che ho cercato di fare:

  • passi:
    1. Ho semplicemente creato 2 controller di visualizzazione e un controller di visualizzazione di pagina in Storyboard.
    2. Poi ho aggiunto del codice al proprietario del file di PageViewController a comportarsi come a dataSource e delegate a se stesso.
    3. Quando ho corso, le cose hanno funzionato bene.
    4. Ho aggiunto alcuni pulsanti e campi di testo al secondo controller della vista.
    5. Ho corso, ho lavorato bene.
    6. Ora ho aggiunto una vista testuale al secondo controller della vista e ho eseguito. Quando ho provato a scrivere qualcosa all'interno della visualizzazione del testo, il controllo della pagina ha tremato e si è spostato sulla prima vista del controller.

Qualcuno ha mai provato questo?

@interface AMPageViewController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate>

@end

L'implemento:

#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

Se vuoi scaricare e provare il progetto


11
2018-02-21 01:38


origine


risposte:


Ho studiato molto su questo problema. Sembra un bug relativo al UIScrollView (privato) interno di UIPageViewController. Se cerchi su StackOverflow troverai molti post con questo problema e nessuna soluzione ...

Sembra che UITextView (che è un UIScrollView e, AFAIR, ha un UIWebView interno), manda qualche strano messaggio alla sua catena di supervisioni, che rende l'UIScrollView privato di UIPageViewController che scorre verso l'angolo in alto a sinistra.

Avrei provato a bloccare questo messaggio usando il metodo swizzling, ma probabilmente non è ok per AppStore. Quindi ho provato altre cose.

La soluzione finale è molto semplice: semplicemente, inserisci il tuo UITextView all'interno di un UIScrollView!

Questo è un link al tuo progetto aggiornato

Se lo fai, risolvi il problema!

Prova e fammi sapere

MODIFICARE:

Come sono arrivato a questa soluzione:

Un'intuizione

Un sacco di tracce di debug e stack mi hanno fatto pensare che il problema fosse relativo a un bug nel sistema di "nesting UIScrollView" e ad alcuni messaggi inviati dalla vista interna alla sua superview.

UITextView eredita da UIScrollView e ha all'interno un UIWebDocumentView (privato) che è un altro UIScrollView. Durante il debug ho visto molti messaggi (metodi privati) come "relayout superview" inviati a UIScrollView in alto. Quindi, per qualche ragione, la vista di scorrimento interna (UIWebDocumentView?) Stava inviando un messaggio / evento alla sua superview. Questo messaggio / evento (probabilmente a causa di un bug) non si arrestava sul UITextView esterno e veniva inoltrato a UIScrollView gestito da UIPageViewController.

Incorporare UITextView all'interno di un semplice UIView non era sufficiente, perché UIView inoltra il messaggio alla sua superview se non può gestire. Ho pensato: UIScrollView probabilmente no (altrimenti non sarebbe semplice annidare UIScrollViews), quindi ho provato e ha funzionato.

Questo è tutto un presupposto perché ho smesso di ispezionare, avrò un aspetto più approfondito questa settimana.


7
2018-05-05 21:20



Crea target iOS-7.0.

Il trucco a scorrimento non funzionava per me. Ho cercato di incorporare la vista testuale in una scrollview attraverso storyboard e codice ma senza fortuna.

Semplicemente ritardare la chiamata alla vista testo lo ha fatto. Non molto elegante, ma è l'unica cosa che ho lavorato fino ad ora.

- (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];
    });
}

Testato, lavorando sul mio iPhone 5 e il mio iPhone4 ultra-lento. Sebbene sia del tutto possibile che qualsiasi dettaglio di implementazione consenta che la visualizzazione del testo possa diventare il rispondente potrebbe richiedere più tempo rispetto al tempo impostato. Quindi tieni presente che questo non è esattamente a prova di proiettile.

--MODIFICARE--

Beh ... sta funzionando con il mio iPhone 4 con un ritardo di 0.0000000000000001


1
2017-07-03 06:05



non hai impostato prima e dopo i controller di visualizzazione e anche il primo interlocutore per socController


0
2018-05-01 08:02