Ios 为什么视图控制器';s头球?
我正在学习objective-c,我在书中发现了以下代码。我有三个问题Ios 为什么视图控制器';s头球?,ios,objective-c,uitableview,delegates,datasource,Ios,Objective C,Uitableview,Delegates,Datasource,我正在学习objective-c,我在书中发现了以下代码。我有三个问题 显然,它通过实现两个必需的方法来符合协议,但是为什么不在头中写入 它符合哪个协议,UITableViewDataSource或UITableViewDelegate 为什么没有UITableView.delegate=self 这是密码 @implementation ItemsViewController -(instancetype) init { self = [super initWithStyle:UIT
UITableViewDataSource
或UITableViewDelegate
李>
UITableView.delegate=self
@implementation ItemsViewController
-(instancetype) init
{
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
for (int i = 0; i < 5; i++)
{
[[ItemStore sharedStore] creatItem];
}
}
return self;
}
-(instancetype) initWithStyle:(UITableViewStyle)style
{
return [self init];
}
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[[ItemStore sharedStore] allItems] count];
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *c = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath];
NSArray *items = [[ItemStore sharedStore] allItems];
Item *item = [items objectAtIndex:indexPath.row];
c.textLabel.text = [item description];
return c;
}
-(void) viewDidLoad
{
[super viewDidLoad];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];
}
@end
@implementation ItemsViewController
-(instancetype)初始化
{
self=[super initWithStyle:UITableViewStylePlain];
如果(自我){
对于(int i=0;i<5;i++)
{
[[ItemStore sharedStore]creatItem];
}
}
回归自我;
}
-(instancetype)initWithStyle:(UITableViewStyle)样式
{
返回[自初始化];
}
-(NSInteger)表视图:(UITableView*)表视图行数节:(NSInteger)节
{
返回[[[ItemStore sharedStore]所有项]计数];
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell*c=[tableView dequeueReusableCellWithIdentifier:@“UITableViewCell”forIndexPath:indexPath];
NSArray*项=[[ItemStore sharedStore]所有项];
Item*Item=[items objectAtIndex:indexath.row];
c、 textLabel.text=[项目说明];
返回c;
}
-(无效)viewDidLoad
{
[超级视图下载];
[self.tableView注册表类:[UITableViewCell类]强制重用标识符:@“UITableViewCell”];
}
@结束
感谢您在理解这一点上的帮助。
1。显然,它通过实现两个必需的方法来符合协议,但为什么不在头中写入“”
标头中的“”只是向编译器指示要在类中实现委托方法。如果不实现标记为@required的委托方法,您将收到警告,但由于大多数委托方法通常是@可选的,您的代码将编译并运行良好。但这并不意味着不应该在标题中添加代理
2。它符合哪个协议,UITableViewDataSource还是UITableViewDelegate?
默认情况下,它只需要UITableViewDataSource
,必须定义这两个函数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
3。为什么没有UITableView.delegate=self?
在那里,检查您的xib
您也从xib设置了委托。右键单击UITableView
您将理解我的意思,如果不设置委派,上述方法将无法工作
希望这能有所帮助。1。显然,它通过实现两个必需的方法来符合协议,但为什么不在头中写入“”
标头中的“”只是向编译器指示要在类中实现委托方法。如果不实现标记为@required的委托方法,您将收到警告,但由于大多数委托方法通常是@可选的,您的代码将编译并运行良好。但这并不意味着不应该在标题中添加代理
2。它符合哪个协议,UITableViewDataSource还是UITableViewDelegate?
默认情况下,它只需要UITableViewDataSource
,必须定义这两个函数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
3。为什么没有UITableView.delegate=self?
在那里,检查您的xib
您也从xib设置了委托。右键单击UITableView
您将理解我的意思,如果不设置委派,上述方法将无法工作
希望这能有所帮助。我同意@iphone,但第一点是这样的
标头中的“”表示编译器类的实例确实响应该协议。编译器将该信息用作类型匹配的添加信息。例如,为表视图设置委托或数据源属性时
若您不在类的头中写入“”,并且编写类似“tableView.dataSource=self”的内容,则会收到警告。当您使用IB或故事板时,您不会编写设置行。这就是您不必在类接口中包含协议声明的原因。我同意@iphone,但这是第一点
标头中的“”表示编译器类的实例确实响应该协议。编译器将该信息用作类型匹配的添加信息。例如,为表视图设置委托或数据源属性时
若您不在类的头中写入“”,并且编写类似“tableView.dataSource=self”的内容,则会收到警告。当您使用IB或故事板时,您不会编写设置行。这就是您不必在类接口中包含协议声明的原因。ItemsViewController
看起来是一个UITableViewController
。UITableViewController
实例是通过self.tableView
访问的包含的UITableView
的默认委托和数据源
因此,没有明确的协议实现标记
和设置self.tableView.delegate=self
和self.tableView.datasource=self
但是,您可以选择将不同的实例设置为delegate
和datasource
。在这种情况下,您需要创建该实例,在其中实现所需的方法,并将其分配给tableView
希望有帮助 ItemsViewController
看起来是一个UITableViewController
。一个UITableViewController
实例就是de