ios - viewController 中的 UiTableView - 未调用委托(delegate)和数据源方法

标签 ios objective-c uitableview delegates uipageviewcontroller

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

现在对于 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 中添加了 subview 。尝试将 subview v1 和 v2 添加到 pageContentViewController.view 会导致不再调用委托(delegate)方法吗?

编辑2 我最终将 tableView socket 放在 pageContentViewController.h 文件中,并在那里设置 dataSource 和 tableView 的委托(delegate)。现在效果很好。仍然不知道如何在 viewController 中设置 tableView 并在 pageContentViewController 中将表正确显示为页面,但此解决方案目前可以使用。我刚开始学习 objectiveC/cocoa,所以我稍后会弄清楚。

最佳答案

问题是,TableView 没有添加到您的 View 中。您只需初始化 View 。

在教程中, Storyboard用于放置 UI 元素。您可以通过这种方式将 UITableView 添加到 Storyboard并创建委托(delegate)并在 viewDidLoad 方法中设置委托(delegate)和数据源。

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,您应该将它添加到您的 View 中。

ViewController.m

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

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

关于ios - viewController 中的 UiTableView - 未调用委托(delegate)和数据源方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33204447/

相关文章:

iphone - 使服务器上的 API 仅供我使用

ios - 哪个优先级更高?代码还是 Storyboard?

ios - 在今天的扩展中,我如何从主应用程序获取数据?

iOS - UITableViewCell 在被选中后不显示复选标记

ios - 了解 UITableView dequeueReusableCellWithIdentifier - 即使在第一次调用时也返回单元格

objective-c - 我应该如何将对象实例导入核心数据?

ios - 如何在 iOS 中缩放 UIScrollview 内部 Imageview?

ios - Xcode Storyboard textview 错误在中间被切断

iphone - 直播 iPhone 视频提要 iPhone SDK

ios - 添加新内容并刷新 UITableView 会在 Swift 中卡住我的应用程序几秒钟