制作 UITableViewDataSource 的主视图控制器委托
Posted
技术标签:
【中文标题】制作 UITableViewDataSource 的主视图控制器委托【英文标题】:Making Main View Controller Delegate of UITableViewDataSource 【发布时间】:2015-07-27 02:15:32 【问题描述】:我是 ios 开发新手。我的主视图控制器不显示其表格视图中的任何单元格。我试图将它设置为现在只显示一个单元格。主视图控制器是 UIViewController 的子类,并且有一个带有原型单元格的表格视图。所以我的 MainViewController.h 文件如下所示:
#import <UIKit/UIKit.h>
@interface MainViewController : UIViewController <UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton;
@end
我让 MainVewController 成为 UITableViewDataSource 的代表,这是正确的想法吗?我的 MainViewController.m 如下所示:
#import "MainViewController.h"
#import "SWRevealViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
[super viewDidLoad];
self.title = @"Home";
SWRevealViewController *revealViewController = self.revealViewController;
if(revealViewController)
[self.sidebarButton setTarget: self.revealViewController];
[self.sidebarButton setAction: @selector(revealToggle:)];
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 1; //change to number of post objects in array (array.count)
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"basicCell" forIndexPath:indexPath];
return cell;
@end
我不明白我在这里做错了什么。我的 MainViewController 的表格视图不应该正确显示单元格吗?想法?
【问题讨论】:
【参考方案1】:你应该在 viewDidLoad 中使用:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
【讨论】:
它说“在这个对象上找不到属性'表格视图'”。而且,我需要这个:我没有看到 Table View 插座。您是否忘记将界面生成器中的表格视图连接到您的视图控制器头文件?之后,您还应该将表视图的委托和数据源属性分配给“self”。
【讨论】:
对了,我忘了。我知道我需要将表格视图连接到界面,但是为什么我们不需要连接表格中的单元格呢?有点困惑。 你不需要这样做,只需要表格视图。单元格是通过重用标识符获得的,您可以通过编程方式访问它们的组件(cell.textLabel = @"text to display";)【参考方案3】:你的类只符合<UITableViewDataSource>
你也应该遵守UITableViewDelegate
这样做。
@interface MainViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
您错过了设置delegate
和dataSource
可以通过两种方式完成:
使用代码:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
将此代码放入viewDidLoad:
-
使用情节提要: ctrl 从
tableView
拖动到您的ViewController
并将其设置为delegate
和dataSource
。见下图。
编辑:
-
为什么我们不需要连接表格的单元格呢?
Ans: 表格单元格是从dataSource
方法tableView:cellForRowAtIndexPath:
返回的。此单元格显示在tableView
中。所以我们不在情节提要中连接它。但是我们可以在情节提要中对其进行配置。
-
数据源和委托有什么区别?
回答:委托:委托是一个对象,它被委托控制该事件的用户界面。
数据源:数据源类似于委托,不同之处在于,它不是被委托控制用户界面,而是被委托控制数据。
有关更多信息,请参阅Delegates and Data Sources 和 this answer.
【讨论】:
以上是关于制作 UITableViewDataSource 的主视图控制器委托的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 和 UITableViewDataSource
Swift 3 UITableViewDataSource 选择器
ViewController 未确认协议“UITableViewDataSource”
类型“ViewController”不符合协议“UITableViewDataSource”
viewcontroller 是不是符合“UITableViewDataSource, Video Mode Delegate”协议?