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 = @"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";
}
}
</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'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 = ;
</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 < MAX_INDEX)? : nil;
}
- (MyIndexKnowingViewController *)viewControllerAtIndex:(NSUInteger)index {
// assuming it's defined in a xib, otherwise, just alloc-init
MyIndexKnowingViewController *childViewController = [ initWithNibName:@"MyIndexKnowingViewController" 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]