【问题标题】:How To Set up a UIPageViewController如何设置 UIPageViewController
【发布时间】:2014-06-22 02:04:56
【问题描述】:

我一直在寻找有关设置 UIPageViewController 的教程,因为有人建议不要使用我的导航控制器,而是使用 PageView。我也在使用左右滑动手势,但我还没有找到关于通过情节提要(或至少大多数情节提要)设置 UIPageViewController 的在线教程。

我附上了一张我目前正在使用的图片:http://imgur.com/a0iuFNW

任何关于设置 PageViewController 和后续控制器的帮助将不胜感激!

感谢您在高级方面的帮助

【问题讨论】:

    标签: ios xcode uipageviewcontroller


    【解决方案1】:

    如果您使用 Google 搜索,我相信您可以找到一些教程,但这应该让您开始尝试自己的实现。我从“Page-Base Application”模板开始创建了一个新项目。您应该研究让您尝试理解它的作用的代码(以及阅读 Apple 关于 UIPageViewController 的文档)。

    该项目创建了几个对象。 RootViewController 创建页面视图控制器并将其添加为子视图控制器。对于我的测试应用程序,除了将页面视图控制器的过渡样式更改为 UIPageViewControllerTransitionStyleScroll(而不是页面卷曲,但您也应该尝试原始值以查看它的外观)之外,我没有更改此文件中的任何内容。

    ModelController 类包含模型,在您的情况下,它是一个图像名称数组(或我所拥有的名称片段)。此类实现处理页面翻转的页面视图控制器数据源方法。我把那个类中的init方法改成了这个,

    - (id)init {
        if (self = [super init]) {
            _pageData = @[@"1", @"2", @"3", @"4", @"5", @"6"]; // my images are named img1.JPG, img2.JPG, etc. I will use these numbers to construct the path to my files in the bundle
        }
        return self;
    }
    

    因此,您可以看到模型只是一个数字字符串数组(每个图像一个数字)。根据图像的命名方式,您可能需要尝试不同的方法。当您在页面之间滑动时,此数组的索引会增加或减少,并且数组中的值会传递给 DataViewController 到它的 dataObject 属性中。

    DataViewController 是实际显示您的内容的控制器。它是故事板中的正确控制器。我通过在顶部添加导航栏来修改它的视图,以便我们可以放入标题和按钮(转到您的提示视图控制器),并将 UIView 子视图替换为占据导航栏下方整个屏幕的 UIImageView。我为图像视图和导航栏制作了 IBOutlets。这是该控制器更改后的 .h 文件,

    @interface DataViewController : UIViewController
    
    @property (strong, nonatomic) NSString  *dataObject;
    

    最后,在.m文件中,我把它变成了这个样子,

    @interface DataViewController ()
    @property (weak,nonatomic) IBOutlet UINavigationBar *bar;
    @property (weak,nonatomic) IBOutlet UIImageView *iv;
    @end
    
    @implementation DataViewController
    
    
    - (void)viewDidLoad{
        [super viewDidLoad];
        UINavigationItem *titleItem = self.bar.items[0];
        titleItem.title = [NSString stringWithFormat:@"Course Guide %@",self.dataObject];
        NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"img%@", self.dataObject] ofType:@"JPG"];
        self.iv.image = [UIImage imageWithContentsOfFile:imagePath];
    }
    
    -(void)dealloc {
        NSLog(@"in dealloc");
    }
    

    我正在使用 initWithContentsOfFile: 根据传入 dataObject 的数字创建图像(而不是 imageNamed:,因为它不缓存图像)。我实现了 dealloc 来说明这样一个事实,即当您在页面中来回滑动时,控制器被释放,从而使您的内存占用保持较小。如果过渡样式是卷曲,控制器一离开屏幕就会被释放,因此一次不会超过一个。如果样式是滚动样式,则一次存在 3 个,因为页面视图控制器会创建当前样式以及上一个和下一个样式,以加快加载速度。

    如您所见,我只对模板提供给您的代码进行了一些小改动,以便显示适合您目的的图像数组。与在导航控制器中使用控制器堆栈相比,为您的应用程序构建这样的结构将更加节省内存。

    【讨论】:

    • 感谢您的深入回答。非常感激。在您的“测试应用程序”中,您是否创建了两个 Objective-C 类,一个名为:DataViewController(UIViewController 的子类),另一个名为 ModelViewController(也是 UIViewController 的子类)?我了解大部分代码,除了放置它的位置。例如,您提到了 init 方法。 init 方法应该放在默认的 viewcontroller.m 中还是您提到的新类之一中?最后两个代码块也是如此。
    • @user3743364,我没有创建任何新类,所有对象都已在模板中创建。如果您查看第一个代码块正上方的段落,它表明代码在 ModelController 中。至于其他代码,您可以在代码中看到类的名称 DataViewController。我使用 Xcode 5.1 创建了这个应用程序,所有代码,除了我的小改动,都在模板中。
    • 我重新创建了每个 sn-p 代码,将 (id)init 放在默认模板 viewcontroller.m 中,第二个代码块放在 viewcontroller.h 中,最后再次放在viewcontroller.m 也是如此。我将导航栏和图像视图与 IBOutlet 连接起来,一切似乎都顺利进行了。 Xcode 说:“使用未声明的标识符'_pageData',我不太确定如何修复:imgur.com/3QLrj8v 另外,如果我的图像被命名为(比如说)golf1.png、golf2.png、golf3.png 等。 . 我如何将这些名称实现到 .m 文件中,就像您对 @"1",@"2"etc 所做的那样
    • @user3743364 你从什么模板开始,你使用什么版本的 Xcode?这些不是正确的课程。
    • 我正在使用 Xcode 5.1.1,我正在使用带有情节提要的单视图应用程序
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多