2010-03-16 4 views
12

Я пытаюсь использовать UITableView без использования наконечника и без использования UITableViewController.как установить делегат таблицы представления

Я добавил 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

Вы должны соответствовать своему классу к UITableViewDelegate и UITableViewDataSource протоколам. (cellForRowAtIndexPath: в протоколе UITableViewDataSource)

ли это с помощью угловых скобок в вашем определении интерфейса класса:

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

Причина, почему вы получаете это предупреждение сейчас, а не раньше, когда вы использовали UITableViewController является потому что UITableViewController уже соответствует этим протоколам.

Таким образом, по существу, UITableViewController является классом, который соответствует UITableViewDelegate и UITableViewDataSource и имеет член экземпляра UITableView. Это в значительной степени.

Конечно, если вы еще не подклассов UITableViewController, то вам необходимо установить вручную dataSource и delegate из UITableView:

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

о.k спасибо, ребята, что заставило ошибку уйти. Я полагаю, что использование <..> - это когда вы хотите реализовать более одного интерфейса? У меня все еще есть проблема, ни один из моих методов tableview не вызван. [table reloadData] не влияет, и мой метод didSelectRowAtIndexPath не выполняется, когда я нажимаю на ячейку. Можете ли вы придумать что-нибудь еще, что я могу потерять? – dubbeat

+1

Ничего, я забыл также установить источник данных, а также делегат – dubbeat

1

Предупреждение просто говорит вам, что ваш @interface раздел должен заявить, что вы реализуете UITableViewDelegate протокол:

@interface MyUIViewController : UIViewController <UITableViewDelegate> 
16

вы также должны установить DataSource делегат себя:

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

или, в равной степени:

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

В чем разница? – RGriffiths

+1

@RichardGriffiths Разница чисто стилистическая. Оба являются сеттерами и выполняют одно и то же. –

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. 
     } 
} 
Смежные вопросы