2014-03-19 79 views
2

我在學習Objective-C,並在書中找到下面的代碼。我有3個問題,爲什麼在視圖控制器的頭文件中沒有協議聲明?

  1. 很明顯,它通過實施兩個所需的方法符合協議,但爲什麼這不工作而不寫入<UITableViewDataSource,UITableViewDelegate>在頭中?
  2. 它符合哪種協議,UITableViewDataSourceUITableViewDelegate
  3. 爲什麼沒有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 

感謝您的幫助理解這一點。

回答

1

ItemsViewController看起來是UITableViewController。 A UITableViewController實例是通過self.tableView訪問的包含UITableView的默認delegatedatasource

因此沒有明確的協議實現<UITableViewDataSource,UITableViewDelegate>的標誌,並設置self.tableView.delegate = selfself.tableView.datasource = self

但是,您可以選擇設置不同的實例在這種情況下,delegatedatasource你需要創建一個實例,實現所需的方法它並將其分配給tableView

希望有幫助!

+0

謝謝!當我將不同的實例設置爲委託或數據源時,如果該類不是UITableViewController的子類,是否需要在該實例的類頭中顯式聲明'<'UITableViewDataSource,UITableViewDelegate'>'? – wz366

+0

@ wz366是的,將接口標記爲已實施的協議是一種很好的做法。 – Amar

+0

但它是強制性的? – wz366

2

1. Obviously it conforms the protocol by implementing two required methods, but why this works without writing '<'UITableViewDataSource,UITableViewDelegate'>' in the header?

的「<‘UITableViewDataSource,的UITableViewDelegate’>」你的頭只是一個指示,要實現你的類的委託方法的編譯器。如果您未實現標記爲@required的代理方法,您將收到警告,但由於大多數代理方法通常是@optional您的代碼將編譯並運行良好。這並不意味着你不應該在你的頭文件中添加代表。

2. Which protocol it conforms, UITableViewDataSource or UITableViewDelegate?

默認情況下,只需要UITableViewDataSource與這兩個功能必須被定義

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

3. Why there is no UITableView.delegate = self?

正是在那裏,請檢查您xib您從廈門國際銀行設定的委託太。右擊UITableView你會明白我的意思,沒有設置委託上述方法將無法正常工作。

希望這會有所幫助。

+0

謝謝!但是當我需要UITableViewDelegate協議?我沒有使用接口生成器,所以我找不到.xib文件。 – wz366

+0

@ wz366只需按下Command按鈕並點擊'UITableView',您就可以找到要實現的'UITableViewDelegate'方法。 – iphonic

1

我同意@iphonic,但第一點。

頭中的'<'UITableViewDataSource,UITableViewDelegate'>'是編譯器指示類的實例確實響應該協議的指示。該信息被編譯器用作類型匹配的附加信息。例如,爲表視圖設置委託或數據源屬性時。

如果你不在類的頭文件中寫'UITableViewDataSource,UITableViewDelegate'>',並且你寫了類似「tableView.dataSource = self」的東西,那麼你將得到警告。當您使用IB或Storyboard時,您不會寫入該設置線。這就是您不必在類接口中包含協議聲明的原因。

+0

如果我不寫tableView.dataSource = self,tableview如何找到它的委託? – wz366

+0

@ wz366我說過「當你使用IB或故事板」。在IB中,是對象之間的連接。當使用編碼器創建表視圖時,它的屬性(數據源,委託等)被初始化。 – Gabriel

+1

順便說一句。如果要在代碼中初始化一個表視圖控制器(無IB或SB),則表視圖會自動創建爲其tableView屬性,並在控制器中作爲dataSource和delegate進行鏈接。在這種情況下,編譯器不需要做任何事情,也不需要協議的聲明。 – Gabriel

相關問題