Как установить делегат tableview
Я пытаюсь использовать UITableView
без использования наконечника и без использования UITableViewController
.
Я добавил экземпляр UITableView
в UIViewController
Like So
mytable = [[UITableView alloc] initWithFrame:CGRectMake(22, 207, 270, 233)];
[mytable setDelegate:self];
[self.view mytable];
Также я добавил следующие методы представления таблицы в мой UIViewController
(сокращение для краткости ради)
- (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
из новых параметров файла)
Ответы
Ответ 1
Вам необходимо сопоставить свой класс с протоколами UITableViewDelegate
и UITableViewDataSource
. (cellForRowAtIndexPath:
находится в протоколе UITableViewDataSource
)
Сделайте это, используя угловые скобки в определении интерфейса класса:
@interface myViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {...}
Причина, по которой вы получаете это предупреждение сейчас, а не раньше, когда вы использовали UITableViewController
, состоит в том, что UITableViewController
уже соответствует этим протоколам.
Таким образом, по существу a UITableViewController
- это просто класс, который соответствует UITableViewDelegate
и UITableViewDataSource
, и имеет член экземпляра UITableView
.
Это в значительной степени это.
Конечно, если вы еще не подклассифицируете UITableViewController
, вам нужно вручную настроить dataSource
и delegate
UITableView
:
[tableView setDelegate:self];
[tableView setDataSource:self];
Ответ 2
Вы также должны установить делегат dataSource для себя:
[tableView setDelegate:self];
[tableView setDataSource:self];
или, в равной степени:
tableview.delegate = self;
tableview.dataSource = self;
Ответ 3
Предупреждение просто говорит вам, что ваш раздел @interface
должен объявить, что вы реализуете протокол UITableViewDelegate
:
@interface MyUIViewController : UIViewController < UITableViewDelegate >
Ответ 4
[tableview setDataSource:self]
Вы должны дать это определенно. Почему из-за двух методов required UITableView
находятся под протоколом UITableViewDataSource
.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Ответ 5
В 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.
}
}