如何根据PageViewController更改按钮的操作?

时间:2014-07-27 17:02:49

标签: ios objective-c uibutton xcode5 uipageviewcontroller

简介

Hello world,我是Objective C的新手,我一直在试验PageViewController。我在制作此应用时遇到的一个问题是根据PageViewController更改按钮的操作。我已经以多种方式处理过这种情况。

情况

我试图让PageViewController帮助玩家选择游戏主题,但为了做到这一点,我需要弄清楚这个问题的答案。我遵循了这个tutorial,除了我摆脱了startWalkthrough按钮,因为它是不必要的,我更改了self.pageViewController.view = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.size.height - 200);以及更改主视图控制器上的NSArray _pageTitles = @[@"Theme 1", @"Theme 2", @"Theme 3", @"Theme 4"];为按钮等提供更多空间。

我做了一个新按钮(chooseButton)和一个标签(themeTitles),作为一个例子,检查应用程序是否实现了它在主视图控制器上的主题。我尝试使用以下代码行:

- (IBAction)chooseButton:(id)sender {
    if () {
    _themeTitles.text = @"You chose theme 1";
    }

    if () {
    _themeTitles.text = @"You chose theme 2";
    }

    if () {
    _themeTitles.text = @"You chose theme 3";
    }

    if () {
    _themeTitles.text = @"You chose theme 4";
    }
}

您可能会注意到该条件为空白。这是我尝试过各种各样的事情的部分。这可能包括使用其他头文件中的属性,或在其自己的头文件中声明的属性,例如声明PageContentViewController *pageContentViewController;然后说if (pageContentViewController.pageIndex == 0)等等,直到等于3,或者说if (pageContentViewController.titleText isEqual: @"Theme 1")

我还尝试在导入后声明AppDelegate *appDelegate;并将UIPageControl公开作为属性,并使currentPage属性说if (AppDelegate.pageControl.currentPage == 0)等等。

我疯狂地厌倦了每一个选项,而他们最终都在界面上显示“你选择了主题1”,对于它所在的每个当前页面,或者它根本不显示任何内容。

最终,重点是,我可以在if语句中添加什么条件来使这个东西工作?

1 个答案:

答案 0 :(得分:1)

UIPageViewController没有页码的本地概念。它可以告诉您viewControllers属性中当前可见的视图控制器,但是将它们映射到页面是您的工作。

为什么呢?想象一本大书,每个页面都是一个视图控制器。将所有这些保留在内存中是一种浪费(UINavigationController保持在当前堆栈周围的方式)。所以UIPageViewController使页面数组是虚拟的,只询问你的数据源是否有相对于当前视图控制器的视图控制器。

该怎么办? SO中有一些文章提出了建议。我最喜欢的是@ EddieBorja的回答here。简而言之,在创建视图控制器时为它们分配索引属性(或pageNumber)属性。

完成后,您的操作方法可能如下所示:

- (IBAction)chooseButton:(id)sender {
    // get the currently visible view controllers
    NSArray *viewControllers = self.myPageViewController.viewControllers

    // get the first visible one
    MyIndexKnowingViewController *myIndexKnowingVC = viewControllers[0];

    // branch on it's index
    if (myIndexKnowingVC.index == 0) {
        _themeTitles.text = @"You chose theme 1";
    } else (myIndexKnowingVC.index == 1) { 
    // etc.

    // if you have more than a few of these, consider a switch statement
    // or even better ...
    _themeTitles.text = [NSString stringWithFormat:@"You chose theme %d", myIndexKnowingVC.index+1];

以下是我如何实现数据源来设置索引(并在回答数据源协议时利用它):

#pragma mark - Page vc datasource

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

    NSUInteger index = ((MyIndexKnowingViewController *)viewController).index;
    return (index)? [self viewControllerAtIndex:index-1] : nil;    
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

    // note the +1
    NSUInteger index = ((MyIndexKnowingViewController *)viewController).index + 1;

    // define a max index that is one _greater_ then your number of pages
    return (index < MAX_INDEX)? [self viewControllerAtIndex:index] : nil;
}

- (MyIndexKnowingViewController *)viewControllerAtIndex:(NSUInteger)index {

    // assuming it's defined in a xib, otherwise, just alloc-init
    MyIndexKnowingViewController *childViewController = [[MyIndexKnowingViewController alloc] initWithNibName:@"MyIndexKnowingViewController" bundle:nil];
    childViewController.index = index;

    return childViewController;
}