ViewDidLoad 不断在 UIPageViewController 上被调用

Posted

技术标签:

【中文标题】ViewDidLoad 不断在 UIPageViewController 上被调用【英文标题】:ViewDidLoad keeps getting called on UIPageViewController 【发布时间】:2015-07-01 09:45:07 【问题描述】:

我正在尝试制作一个带有 UITableViewController 的 UIPageViewController。

我无法让 UIPageViewController 正常工作。 ViewDidLoad 不断被调用,视图永远不会显示在我的 ios 模拟器上。

这是我的课程:

ProgramViewController.h:

#import <UIKit/UIKit.h>
#import "TableViewController.h"

@interface ProgramViewController : UIPageViewController <UIPageViewControllerDataSource>

    UIPageViewController *programViewController;
    NSArray *pageContent;


@property (strong, nonatomic) UIPageViewController *programViewController;
@property (strong, nonatomic) NSArray *pageContent;
@property (strong, nonatomic) NSArray *listArray;
@property (strong, nonatomic) NSArray *pageTitles;

ProgramViewController.m

#import "ProgramViewController.h"

@implementation ProgramViewController
@synthesize programViewController,pageContent;

- (void)viewDidLoad

    [super viewDidLoad];
    NSLog(@"ViewDidLoad");

    _pageTitles = @[@"page0", @"page1", @"page2"];

    self.programViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"2"];
    self.programViewController.dataSource = self;

    TableViewController *startingViewController = [self viewControllerAtIndex:0];
    NSLog(@"description = %@",[startingViewController description]);
    NSArray *viewControllers = @[startingViewController];
    [self.programViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    // Change the size of page view controller
    self.programViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);

    [self addChildViewController:programViewController];
    [self.view addSubview:programViewController.view];
    [self.programViewController didMoveToParentViewController:self];



#pragma mark - Page View Controller Data Source

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

    NSUInteger index = ((TableViewController*) viewController).pageIndex;

    if ((index == 0) || (index == NSNotFound)) 
        return nil;
    

    index--;
    return [self viewControllerAtIndex:index];


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController

    NSUInteger index = ((TableViewController*) viewController).pageIndex;

    if (index == NSNotFound) 
        return nil;
    

    index++;
    if (index == [self.pageTitles count]) 
        return nil;
    
    return [self viewControllerAtIndex:index];


- (TableViewController *)viewControllerAtIndex:(NSUInteger)index

    if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) 
        return nil;
    
    NSLog(@"description = %d",[self.pageTitles count]);

    // Create a new view controller and pass suitable data.
    TableViewController *tableViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"2.0"];
    tableViewController.titleText = self.pageTitles[index];
    tableViewController.pageIndex = index;

    return tableViewController;


- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController

    return [self.pageTitles count];


- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController

    return 0;

然后我有了 UITableViewController 类。这个类在我单独使用时可以完美运行,但我不知道尝试将 UITableViewController 放在 UIPageViewController 中是否存在问题:

TableViewController.h

#import <UIKit/UIKit.h>

@interface TableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@property NSUInteger pageIndex;
@property NSString *titleText;

@end

TableViewController.m

#import "TableViewController.h"
#import "ProgramCell.h"

@implementation TableViewController

    NSArray *arrayDays;

- (void)viewDidLoad

    [super viewDidLoad];
    // Initialize table data
    for(int i=0;i<10;i++)

    
    arrayDays = [NSArray arrayWithObjects:@"Egg Benedict", @"Mushroom Risotto", @"Full Breakfast", @"Hamburger", @"Ham and Egg Sandwich", @"Creme Brelee", @"White Chocolate Donut", @"Starbucks Coffee", @"Vegetable Curry", @"Instant Noodle with Egg", @"Noodle with BBQ Pork", @"Japanese Noodle with Pork", @"Green Tea", @"Thai Shrimp Cake", @"Angry Birds Cake", @"Ham and Cheese Panini", nil];


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    NSLog(@"description = %d",[arrayDays count]);
    return [arrayDays count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *simpleTableIdentifier = @"CustomCell";

    ProgramCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    NSLog(@"description = %@",[cell description]);

    if (cell == nil) 
        NSLog(@"cell nil");
        cell = [[ProgramCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    
    cell.durationLabelCell.text = @"HOLA";


    return cell;

@end

在 Xcode 控制台上,我不断得到“NSLog(@'ViewDidLoad');”的结果在我的 ProgramViewController.h 上。只要有内存,应用就会实例化 ViewController,然后它就会崩溃。

如果有人知道为什么会发生这种情况,那就太好了。谢谢

【问题讨论】:

【参考方案1】:

IMP:您的 ProgramViewController 类有一个名为 programViewController 的变量(和属性),因此以下解释可能听起来令人困惑。为了方便起见,我将用粗体表示classProgramViewController(大写 P)和正常字体的变量:programViewController(带有小 p)。


这行代码在你的viewDidLoad

self.programViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"2"];

从情节提要中实例化一个新的页面视图控制器,然后您将其添加到 ProgramViewController

如果您的故事板中标识符为 2 的视图控制器也是 ProgramViewController(我怀疑是这种情况),那么您正在创建重复。每次添加 ProgramViewController 时,都会在 viewDidLoad 中创建一个新的。

您的 ProgramViewController 类中不需要另一个 programViewController 变量。删除该变量和属性。使用self 而不是self.programViewController 调用setViewControllers,并删除您将programViewController 添加为子视图和控制器的所有行。

【讨论】:

以上是关于ViewDidLoad 不断在 UIPageViewController 上被调用的主要内容,如果未能解决你的问题,请参考以下文章

异步加载图像不断导致图像闪烁?

线程1:信号SIGABRT不断弹出

动画 calayers 不断跟随手指位置

UIPageViewController 不跟踪页面索引

performeguewithidentifier 在一个 viewDidLoad 中有效,但在另一个 viewDidLoad 中无效,使用“Show”segues

类型“UIPageViewController.OptionsKey”(又名“NSString”)没有成员“interPageSpacing”