Comment ajouter une nouvelle vue-contrôleur dans UIPageViewController après UIButton a été mis sur écoute?
Je me demandais comment puis-je mettre en œuvre des boutons qui aura une incidence sur la UIPageViewController du modèle. Par exemple, je voudrais que mon UIPageViewController modèle de tableau à la charge avec un seul objet dans et quand un bouton est tapé un nouveau point de vue contrôleur sera ajouté et permet de basculer automatiquement de la page ou quelque chose comme ça (comme dans l'application de Notes). De même pour la suppression de l'objet que l'utilisateur voit.
Jusqu'à présent j'ai essayé par la mise en œuvre de certains IBActions à ma racine-vue-contrôleur, mais pas de chance jusqu'à présent.
Voici comment j'ai appliquer ma ViewController classe:
@implementation ViewController
@synthesize modelArray = _modelArray;
@synthesize pageVC = _pageVC;
#pragma mark - UIPageViewControllerDataSource Methods
//Returns the view controller before the given view controller. (required)
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger currentIndex = [self.modelArray indexOfObject:[(ContentVC *)viewController labelContents]];
if(currentIndex==0)
return nil;
ContentVC *cVC = [[ContentVC alloc] init];
cVC.labelContents = [self.modelArray objectAtIndex:currentIndex-1];
return cVC;
}
//Returns the view controller after the given view controller. (required)
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger currentIndex = [self.modelArray indexOfObject:[(ContentVC *)viewController labelContents]];
if(currentIndex==self.modelArray.count-1)
return nil;
ContentVC *cVC = [[ContentVC alloc] init];
cVC.labelContents = [self.modelArray objectAtIndex:currentIndex+1];
return cVC;
}
#pragma mark - UIPageViewControllerDelegate Methods
//Returns the spine location for the given orientation.
- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController
spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
if(UIInterfaceOrientationIsPortrait(orientation)){
//Set the array with only 1 view controller
UIViewController *currentVC = [self.pageVC.viewControllers objectAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:currentVC];
[self.pageVC setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
//Set the doubleSided property to NO
self.pageVC.doubleSided = NO;
//Return the spine location
return UIPageViewControllerSpineLocationMin;
} else { //if landscape
NSArray *viewControllers = nil;
ContentVC *currentVC = [self.pageVC.viewControllers objectAtIndex:0];
NSUInteger currentIndex = [self.modelArray indexOfObject:[(ContentVC *)viewControllers labelContents]];
if(currentIndex==0 || currentIndex %2 == 0){
UIViewController *nextViewController = [self pageViewController:self.pageVC viewControllerAfterViewController:currentVC];
viewControllers = [NSArray arrayWithObjects:currentVC, nextViewController, nil];
} else {
UIViewController *previousVC = [self pageViewController:self.pageVC viewControllerBeforeViewController:currentVC];
viewControllers = [NSArray arrayWithObjects:previousVC, currentVC, nil];
}
//Set the view controllers as property of the UIPageViewController
[self.pageVC setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
return UIPageViewControllerSpineLocationMid;
}
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
//Instantiate the model array
self.modelArray = [[NSMutableArray alloc] init];
[self.modelArray addObject:@"Page One"];
NSLog(@"%@", self.modelArray);
//Instantiate the UIPageViewController
self.pageVC = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
//Assign the delegate and datasource as self
self.pageVC.delegate = self;
self.pageVC.dataSource = self;
//Set the initial view controllers
ContentVC *cVC = [[ContentVC alloc] initWithNibName:@"ContentVC" bundle:nil];
cVC.labelContents = [self.modelArray objectAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:cVC];
[self.pageVC setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
//Add the pageViewController as the childViewController
[self addChildViewController:self.pageVC];
//Add the view of pageViewController to the currentView
[self.view addSubview:self.pageVC.view];
//Call didMoveToParentViewController: of the childViewController, the UIPageViewController instance in our case.
[self.pageVC didMoveToParentViewController:self];
//Assign the gestureRecognizers property of the pageViewController to the view's gestureRecognizers property
self.view.gestureRecognizers = self.pageVC.gestureRecognizers;
}
Merci beaucoup!
OriginalL'auteur user1644365 | 2012-11-04
Vous devez vous connecter pour publier un commentaire.
La
UIPageViewController
utilise une source de données pour obtenir le précédent ou le suivant-vue-contrôleur. Donc la solution est d'ajouter votre nouveau-vue-contrôleur de la source de données une fois que le bouton est touché.Dire votre source de données est mis en place comme un
NSArray
(voir le XCode de la Page basée sur le modèle d'Application pour un exemple de ce que vous venez d'ajouter votre nouveau cr pour ce tableau et définir le nouveau cr en appelant[UIPageViewController setViewControllers:direction:animated:completion:]
.Puisque vous n'avez pas à fournir des détails sur la façon dont vous avez mis en place votre hiérarchie, je ne peux pas être plus précis.
Edit:
Maintenant que j'ai un peu de code, voici ce que j'avais à faire:
D'abord je n'aurais pas à sauver les
labelContents
mais plutôt le point de vue du contrôleur lui-même dans lemodelArray
. En plus d'autres choses, votre conception actuelle crée un nouveauContentVC
à chaque changement de pages. C'est beaucoup de surcharge inutile. Voici comment je voudrais mettre en œuvre:(btw, vous devriez penser à un nom plus descriptif que
labelContents
. Droit maintenant, il pourrait être bien si il y a juste une étiquette, mais que faire si vous ajoutez plus de les étiquettes dans l'avenir?)Le code dans votre commentaire:
ne fonctionne pas parce que vous n'avez pas configuré l'
labelContents
de laContentVC
. Donc, fondamentalement, vous retrouvez l'appel[self.modelObject indexOfObject:nil]
ou[self.modelObject indexOfObject:@""]
en fonction de votre mise en œuvre delabelContents
. Puisque aucun des deux n'est dans la matrice, l'appel renvoieNSNotFound
qui sur les systèmes 64 bits est traduite enNSIntegerMax
et c'est2147483647
. Plus tard, vous essayez d'accéder à votremodelArray
à l'indexNSIntegerMax - 1
et qui soulève unNSRangeException
.Donc peut résoudre que par la mise en au
labelContents
dans votrenewButtonTapped:
méthode ou si vous suivez ma proposition de refonte de votre code:J'ai donc essayé ce - (IBAction)newButtonTapped:(id)sender { if(sender){ [self.modelArray addObject:@Page"Deux"]; ContentVC *newVC = [[ContentVC alloc] initWithNibName:@"ContentVC" bundle:nil]; NSArray *arr = [NSArray arrayWithObject:newVC]; [self.pageVC setViewControllers:arr direction:UIPageViewControllerNavigationDirectionforward d'animation:NON achèvement:nil]; NSLog(@"%@", self.modelArray); } } Et il ajoute le VC cependant, il écrase quand j'essaie de glisser une page. J'ai besoin de mettre à jour quelque chose dans ma source de données comme vous l'avez dit, hein? des idées? 😀
j'ai mis à jour ma réponse
Fonctionne comme un charme! Merci beaucoup pour votre aide!
OriginalL'auteur Tobi