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语句中添加什么条件来使这个东西工作?
答案 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;
}