how to set a tableview delegate

旧城冷巷雨未停 提交于 2019-12-17 18:20:13

问题


I'm trying to use a UITableView without using a nib and without using a UITableViewController.

I have added a UITableView instance to a UIViewController Like So

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

Also I have added the following table view methods to my UIViewController (cut for brevities sake)

- (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 {

I am getting a warning saying that my UIViewController does not implement UITableView delegate protocol.

Whats the correct way to tell the table view where its delegate methods are?

(This is my first attempt at trying to use a UITableView without selecting the UITableTableview controller from the new file options)


回答1:


You need to conform your class to the UITableViewDelegate and UITableViewDataSource protocols. ( cellForRowAtIndexPath: is in the UITableViewDataSource protocol )

Do this by using angle brackets in your class interface definition:

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

The reason why you are getting this warning now and not before when you were using a UITableViewController is because UITableViewController already conforms to these protocols.

So, in essence a UITableViewController is just a class that conforms to UITableViewDelegate and UITableViewDataSource, and has a UITableView instance member. That's pretty much it.

Of course, if you're not already subclassing UITableViewController, then you need to manually setup the dataSource and delegate of the UITableView:

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



回答2:


You also must set the dataSource delegate to self:

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

or, equally:

tableview.delegate = self;
tableview.dataSource = self;



回答3:


The warning is just telling you that your @interface section should declare that you implement the UITableViewDelegate protocol:

@interface MyUIViewController : UIViewController < UITableViewDelegate >



回答4:


[tableview setDataSource:self]

You have to give it definitely, Why because of the two required methods of UITableView are under UITableViewDataSource protocol.

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



回答5:


In Swift3 this is how you set 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.
      }
}


来源:https://stackoverflow.com/questions/2454567/how-to-set-a-tableview-delegate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!