正在实现表功能所需的UITableViewDataSource协议

时间:2015-04-01 14:34:28

标签: ios uitableview swift uiviewcontroller

我创建了一个带声明

的类
  

class LessonDetailsViewController:UIViewController {   @IBOutlet var detailsTable:UITableView!

我可以填充表格中的内容并通过实现提供操作 适当的tableView函数。

但我没有实现定义所有这些函数的UITableViewDataSource协议。有人可以向我解释我错过了哪些关键概念使这成为可能吗? iOS如何知道调用这个类的这些方法并没有实现UITableViewDataSource协议?

3 个答案:

答案 0 :(得分:0)

您必须实现UITableview dataSource和委托方法所需的方法。

  • (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  • (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

答案 1 :(得分:0)

你的班级肯定应该从这个协议实施必要的方法。这足以允许表视图工作,因为即使您没有声明您的类实现此协议,您的类也可以执行表视图委托方法。在您的情况下,表格视图会调用您的类以获取某些数据,而不会检查它是否conformsToProtocol,只是发送tableView:numberOfRowsInSection:之类的消息。

答案 2 :(得分:0)

好的我将尝试解释如何连接你的tableView但我将使用Swift

现在你有了这个:

class LessonDetailsViewController: UIViewController { @IBOutlet var detailsTable: UITableView! }

您必须使此视图控制器能够满足tableView工作的两个必要协议

所以添加UITableViewDelegate和UITableViewDataSource

所以现在代码看起来像这样

   class LessonDetailsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var detailsTable: UITableView! }

如果你正确地进行了更改,你会收到一个错误{LessonDetailsViewController不舒服........}。这是因为UITableViewDataSource有两个必须实现的功能。两种协议都有许多,但它们是可选的。

第一个功能是描述每个人的样子。

func tableView(_ tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{}

第二个是女巫告诉tableView要显示多少行。

func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int{}

最后你必须连接tableView。

override func viewDidLoad() {
        super.viewDidLoad()
        detailsTable.delegate = self
        detailsTable.dataSource = self
    }

协议通常定义一些功能但不实现它们。所以在源代码中tableView正在使用这个函数,但你必须先实现它们。通过在UIViewController旁边添加UITableViewDataSource,你基本上告诉系统LessonDetailsViewController将实现tableView需要的这些函数