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