viewController中的UiTableView - 不调用delegate和dataSource方法

时间:2015-10-18 23:32:38

标签: ios objective-c uitableview delegates uipageviewcontroller

我刚刚完成了关于创建UIPageViewController的tutorial。本教程的源代码也可以在本文末尾的链接中找到。现在,我想要为每个页面添加一个带有自定义单元格的tableView,而不是imageView。在PageContentViewController.h文件中,我为tableView添加了IBOutlet,称为“theTableView”。

现在,对于viewController,我做了以下几点:

viewcontroller.h

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

@interface ViewController : UIViewController <UIPageViewControllerDataSource,UITableViewDataSource,UITableViewDelegate>
...
@property (strong, nonatomic) UIPageViewController *pageViewController;
@property (strong, nonatomic) NSArray *pageTitles;
@property (strong, nonatomic) NSArray *tableViews;


@end

viewController.m

- (void)viewDidLoad
{
    //some code
    UITableView* v1=[[UITableView alloc] init];
    v1.dataSource=self;
    v1.delegate=self;

    UITableView* v2=[[UITableView alloc] init];
    v2.dataSource=self;
    v2.delegate=self;

    _tableViews= @[v1, v2];

    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];


 // Create page view controller
    self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageViewController.dataSource = self;

    pageContentViewController.theTableView=self.tableViews[0];
    pageContentViewController.thetableView.frame=CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

    PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

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

    [self addChildViewController:_pageViewController];
    [self.view addSubview:_pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];

 // some code
}

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
    //some code

    // Create a new view controller and pass suitable data.
    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
    pageContentViewController.theTableView = self.tableViews[index];

    return pageContentViewController;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustumCell *cell= (CustumCell *)[tableView dequeueReusableCellWithIdentifier:@"customCell" forIndexPath:indexPath];

    if (cell==nil) {cell = [[CustumCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"customCell"];}

    return cell;
}


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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

最后3种方法没有被调用。我在这做错了什么?

谢谢!

编辑:在下面的答案中添加了建议。仍然得到相同的结果。当我添加SnowMax的解决方案(例如[self.view addSubview v1])时,方法被调用,但tableView没有显示在pageContentViewController中,因为我在viewController中添加了子视图。试图将子视图v1和v2添加到pageContentViewController.view导致不再调用委托方法?

EDIT2 我最终将tableView出口放在pageContentViewController.h文件中,并在那里设置dataView和tableView的委托。现在它很棒。仍然不知道如何在viewController中设置tableView并在pageContentViewController中正确显示表作为页面,但此解决方案现在可以使用。我刚开始学习objectiveC / cocoa,所以我稍后会弄明白。

3 个答案:

答案 0 :(得分:3)

问题是,TableViews没有添加到您的视图中。您只需初始化视图。

在教程中,故事板用于放置UI元素。你可以这样做,并在故事板中添加一个UITableView并创建一个委托,并在viewDidLoad方法中设置委托和数据源。

ViewController.h

@interface ViewController : UIViewController <UIPageViewControllerDataSource,UITableViewDataSource,UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

<强> ViewController.m

- (void)viewDidLoad {
    // Set Delegate and Datasource
    self.tableView.dataSource=self;
    self.tableView.delegate=self;
}

如果要在代码中创建TableView,则应将其添加到视图中。

<强> ViewController.m

- (void)viewDidLoad {
    // Init
    UITableView* v1=[[UITableView alloc] init];
    v1.dataSource=self;
    v1.delegate=self;

    // Place at your view
    [self.view addSubview:v1];
}

答案 1 :(得分:0)

您必须将tableviewpageViewController添加到viewController并设置其代理人。在您的代码中,您没有设置pageViewController

viewDidLoad中添加以下内容:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

self.pageController.dataSource = self;
[[self.pageController view] setFrame:[[self view] bounds]];

PageContentViewController *initialViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.theTableView = self.tableViews[0];

NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

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

有关完整教程的信息,请参阅here

答案 2 :(得分:0)

似乎你做的每件事情都正确,但你没有设置表格视图的frame。设置tableview的框架。

如果你没有设置tableview的框架,那么只有被调用的方法是。

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

希望它适合你。