菜鸟教程小白 发表于 2022-12-13 00:05:26

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


                                            <p><h2>简介</h2>

<p>Hello world,我是 Objective C 的新手,我一直在尝试使用 <code>PageViewController</code>。我在制作这个应用程序时遇到的一个问题是根据 <code>PageViewController</code> 更改按钮的操作。我已经通过多种方式处理了这种情况。</p>

<h2>情况</h2>

<p>我试图制作一个 <code>PageViewController</code> 来帮助玩家为游戏选择主题,但为了做到这一点,我需要弄清楚这个问题的答案。我关注了这个 <a href="http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/" rel="noreferrer noopener nofollow">tutorial</a>除了我去掉了 <code>startWalkthrough</code> 按钮,因为它是不必要的,我更改了 <code>self.pageViewController.view = CGRectMake(0, 100, self.view.frame.size.width, self. view.frame.size.height - 200);</code> 以及改变 NSArray <code>_pageTitles = @[@"Theme 1", @"Theme 2", @"Theme 3", @"Theme 4 "];</code> 在主视图 Controller 上为按钮等留出更多空间。</p>

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

<pre><code>- (IBAction)chooseButton:(id)sender {
    if () {
    _themeTitles.text = @&#34;You chose theme 1&#34;;
    }

    if () {
    _themeTitles.text = @&#34;You chose theme 2&#34;;
    }

    if () {
    _themeTitles.text = @&#34;You chose theme 3&#34;;
    }

    if () {
    _themeTitles.text = @&#34;You chose theme 4&#34;;
    }
}
</code></pre>

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

<p>我还尝试在导入 <code>AppDelegate *appDelegate;</code> 之后声明它,并将 <code>UIPageControl</code> 作为属性公开,并创建 <code>currentPage</code>属性说 <code>if (AppDelegate.pageControl.currentPage == 0)</code> 等等。</p>

<p>我会发疯地用尽每个选项,而他们最终都会在界面上显示“你选择了主题 1”,为它所在的每个当前页面或根本不显示任何内容。</p>

<p><strong>归根结底,关键是,我可以在 if 语句中加入什么条件才能让这件事发挥作用?</strong></p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>UIPageViewController</code> 没有页码的原生概念。它可以告诉您当前在 viewControllers 属性中可见哪些 ViewController ,但您的工作是将它们映射到页面。</p>

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

<p>该怎么办? SO中有几篇文章提出了建议。我最喜欢的是@EddieBorja 的回答 <a href="https://stackoverflow.com/questions/8400870/uipageviewcontroller-return-the-current-visible-view?lq=1" rel="noreferrer noopener nofollow">here</a> .简而言之,在创建 ViewController 时为其分配索引属性(或 pageNumber)属性。</p>

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

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

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

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

    // if you have more than a few of these, consider a switch statement
    // or even better ...
    _themeTitles.text = ;
</code></pre>

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

<pre><code>#pragma mark - Page vc datasource

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

    NSUInteger index = ((MyIndexKnowingViewController *)viewController).index;
    return (index)? : 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 &lt; MAX_INDEX)? : nil;
}

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

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

    return childViewController;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何根据 PageViewController 更改按钮的操作?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/24983331/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/24983331/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何根据 PageViewController 更改按钮的操作?