2010-03-16 130 views
12

我試圖使用UITableView而不使用筆尖,也沒有使用UITableViewController如何設置tableview委託

我添加了一個UITableView實例爲UIViewController像這樣

mytable = [[UITableView alloc] initWithFrame:CGRectMake(22, 207, 270, 233)]; 
[mytable setDelegate:self]; 
[self.view mytable]; 

而且我已經加入如下表視圖的方法來我UIViewController(削減brevities緣故)

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

我得到一個警告說我的UIViewController沒有實現UITableView委託協議。

什麼是正確的方式來告訴表視圖委託方法的地方?

(這是我在試圖用一個UITableView而不選擇在新文件選項UITableTableview控制器首先嚐試)

回答

29

您需要符合你的類的UITableViewDelegateUITableViewDataSource協議。 (cellForRowAtIndexPath:UITableViewDataSource協議)

在你的類接口定義使用尖括號這樣做:

@interface myViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {...} 

爲什麼你當你使用UITableViewController現在沒有得到這一警告之前的原因是因爲UITableViewController已經符合這些協議。

因此,在本質上是UITableViewController僅僅是符合UITableViewDelegateUITableViewDataSource一類,並具有UITableView實例成員。 這就是它。

當然,如果你不是已經繼承UITableViewController,則需要手動設置的dataSourcedelegateUITableView的:

[tableView setDelegate:self]; 
[tableView setDataSource:self]; 
+0

O操作。k謝謝你,這讓錯誤消失了。我想用<..>是你想要實現多個接口嗎?我仍然有一個問題,我的tableview方法都沒有被調用。 [table reloadData]沒有效果,當我點擊一個單元格時,我的didSelectRowAtIndexPath方法也沒有執行。你能想到我可能錯過的其他東西嗎? – dubbeat 2010-03-16 13:49:03

+1

沒關係,我忘了也設置datasource以及代表 – dubbeat 2010-03-16 13:51:55

1

的警告只是告訴你,你的@interface部分應該聲明您實現UITableViewDelegate協議:

@interface MyUIViewController : UIViewController <UITableViewDelegate> 
16

還必須將數據源委託設置爲self:

[tableView setDelegate:self]; 
[tableView setDataSource:self]; 

,或者同樣:

tableview.delegate = self; 
tableview.dataSource = self; 
+0

有什麼區別? – RGriffiths 2013-11-09 13:05:40

+1

@RichardGriffiths區別純粹是文體。兩者都是制定者並完成同樣的事情。 – 2014-01-29 17:27:56

1
[tableview setDataSource:self] 

你必須明確地給它,爲什麼?因爲的UITableView兩個需要方法正在UITableViewDataSource協議。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
0

在Swift3你這是怎麼設置UITableViewDelegate

class FeedsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
     @IBOutlet weak var feedsTableView: UITableView! 
     override func viewDidLoad() { 
      super.viewDidLoad() 

      feedsTableView.delegate = self 
      feedsTableView.dataSource = self 

      // Do any additional setup after loading the view. 
     } 
}