【问题标题】:how to set a tableview delegate如何设置表格视图委托
【发布时间】:2010-03-16 13:18:30
【问题描述】:

我正在尝试使用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 控制器)

【问题讨论】:

    标签: iphone ios objective-c delegates uitableview


    【解决方案1】:

    您需要使您的课程符合UITableViewDelegateUITableViewDataSource 协议。 (cellForRowAtIndexPath:UITableViewDataSource 协议中)

    通过在类接口定义中使用尖括号来做到这一点:

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

    您在使用UITableViewController 时现在而不是之前收到此警告的原因是因为UITableViewController 已经符合这些协议。

    所以,从本质上讲,UITableViewController 只是一个符合UITableViewDelegateUITableViewDataSource 的类,并且有一个UITableView 实例成员。 差不多就这些了。

    当然,如果您还没有继承UITableViewController,那么您需要手动设置UITableViewdataSourcedelegate

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

    【讨论】:

    • 好的,谢谢大家,这让错误消失了。我猜想使用 <..> 是你想要实现多个接口的时候?我还有一个问题,我的 tableview 方法都没有被调用。 [table reloadData] 没有效果,当我单击单元格时,我的 didSelectRowAtIndexPath 方法也没有执行。你能想到我可能遗漏的其他东西吗?
    • 没关系,我忘了设置数据源以及委托
    【解决方案2】:

    您还必须将 dataSource 委托设置为 self:

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

    或者,同样地:

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

    【讨论】:

    • 有什么区别?
    • @RichardGriffiths 不同之处在于纯粹的风格。两者都是二传手,完成同样的事情。
    【解决方案3】:

    警告只是告诉您@interface 部分应声明您实现了UITableViewDelegate 协议:

    @interface MyUIViewController : UIViewController < UITableViewDelegate >
    

    【讨论】:

      【解决方案4】:
      [tableview setDataSource:self]
      

      一定要给,为什么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.
              }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多