Ios 为什么视图控制器';s头球?

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

我正在学习objective-c,我在书中发现了以下代码。我有三个问题

  • 显然,它通过实现两个必需的方法来符合协议,但是为什么不在头中写入
  • 它符合哪个协议,
    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