viewController 中的 UiTableView - 未调用委托和数据源方法
UiTableView in viewController - delegate and dataSource methods not getting called
我刚刚完成了关于创建 UIPageViewController 的 tutorial。教程的源码也可以在文末的link中找到。现在我想为每个页面添加一个带有自定义单元格的 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 中添加了子视图。尝试将子视图 v1 和 v2 添加到 pageContentViewController.view 结果不再调用委托方法?
EDIT2
我最终将 tableView 插座放在 pageContentViewController.h 文件中,并在那里设置 dataSource 和 tableView 的委托。现在效果很好。仍然不知道如何在 viewController 中设置 tableView 并在 pageContentViewController 中将表格正确显示为页面,但此解决方案目前可以使用。刚开始学objectiveC/cocoa,等会再弄明白。
问题是,TableView 没有添加到您的视图中。您只需初始化视图。
在教程中,故事板用于放置 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];
}
您必须将 tableview
和 pageViewController
添加到 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
似乎你做的每件事都是正确的,但是你没有设置 frame
的 table 视图。设置 table 视图的框架。
如果您不设置 tableview
的框架,那么唯一被调用的方法是 .
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
希望它对你有用。
我刚刚完成了关于创建 UIPageViewController 的 tutorial。教程的源码也可以在文末的link中找到。现在我想为每个页面添加一个带有自定义单元格的 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 中添加了子视图。尝试将子视图 v1 和 v2 添加到 pageContentViewController.view 结果不再调用委托方法?
EDIT2 我最终将 tableView 插座放在 pageContentViewController.h 文件中,并在那里设置 dataSource 和 tableView 的委托。现在效果很好。仍然不知道如何在 viewController 中设置 tableView 并在 pageContentViewController 中将表格正确显示为页面,但此解决方案目前可以使用。刚开始学objectiveC/cocoa,等会再弄明白。
问题是,TableView 没有添加到您的视图中。您只需初始化视图。
在教程中,故事板用于放置 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];
}
您必须将 tableview
和 pageViewController
添加到 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
似乎你做的每件事都是正确的,但是你没有设置 frame
的 table 视图。设置 table 视图的框架。
如果您不设置 tableview
的框架,那么唯一被调用的方法是 .
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
希望它对你有用。