OStack程序员社区-中国程序员成长平台

标题: ios - 如何根据 PageViewController 更改按钮的操作? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 00:05
标题: ios - 如何根据 PageViewController 更改按钮的操作?

简介

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 "]; 在主视图 Controller 上为按钮等留出更多空间。

我制作了一个新按钮 (chooseButton) 和一个标签 (themeTitles) 仅作为示例来检查应用程序是否意识到它在主界面上是哪个主题 View Controller 。我尝试使用以下代码行:

- (IBAction)chooseButtonid)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 语句中加入什么条件才能让这件事发挥作用?



Best Answer-推荐答案


UIPageViewController 没有页码的原生概念。它可以告诉您当前在 viewControllers 属性中可见哪些 View Controller ,但您的工作是将它们映射到页面。

为什么?想象一本很大很大的书,其中每个页面都是一个 View Controller 。将所有这些都保存在内存中会很浪费(就像 UINavigationController 保存在当前堆栈中的方式一样)。所以 UIPageViewController 使页面数组是虚拟的,只向你的数据源询问相对于当前的 View Controller 。

该怎么办? SO中有几篇文章提出了建议。我最喜欢的是@EddieBorja 的回答 here .简而言之,在创建 View Controller 时为其分配索引属性(或 pageNumber)属性。

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

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

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

#pragma mark - Page vc datasource

- (UIViewController *)pageViewControllerUIPageViewController *)pageViewController viewControllerBeforeViewControllerUIViewController *)viewController {

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

- (UIViewController *)pageViewControllerUIPageViewController *)pageViewController viewControllerAfterViewControllerUIViewController *)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 *)viewControllerAtIndexNSUInteger)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;
}

关于ios - 如何根据 PageViewController 更改按钮的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983331/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4