self.tableView.delegate = 自我斯威夫特

Posted

技术标签:

【中文标题】self.tableView.delegate = 自我斯威夫特【英文标题】:self.tableView.delegate = self Swift 【发布时间】:2016-09-12 01:00:48 【问题描述】:

如果我有一个 UIViewController 并且我在情节提要中将一个 tableView 连接到它,连接 tableview 插座,然后通过连接检查器连接数据源和委托方法(cntrl+拖动到 vc 橙色圆圈图标),我仍然需要将self.tableView.delegate = selfself.tableView.datasource = self 添加到实际的视图控制器中吗?当然,在实际的 vc 中,我正在实现 tableView 数据/委托协议。

此外,我假设无论答案是否相同,都可以通过故事板以相同的方式连接集合视图控制器?

添加它的优缺点是什么?

class FooController:UIViewController, UITableViewDataSource, UITableViewDelegate 

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()

    self.tableView.delegate = self
    self.tableView.datasource = self



func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int  ... 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell  ... 


【问题讨论】:

根据您使用协议标记问题,似乎对协议与委托有点混淆。大多数 ios 开发人员最初对此感到困惑。我建议你看看这个问题here 【参考方案1】:

我还需要将 self.tableView.delegate = self 添加到实际的视图控制器吗?

没有。您通过在情节提要中建立连接来做到这一点。它们完全相同:对delegate 属性的赋值,以两种不同的方式表示(一种在代码中,一种在Interface Builder 中以“图形方式”)。您只需执行其中一项即可。

但是如果你的视图控制器是一个表视图控制器(UITableViewController 子类),那么你就都不做,因为表视图控制器已经了em> 表视图的数据源和委托。集合视图 controller(UICollectionViewController 子类)也是如此;它是已经集合视图的数据源和委托。

【讨论】:

【参考方案2】:

我通常在 View Controller 的 viewDidLoad 方法中以编程方式设置 delegatedataSource。 因为有时我错过了将它们设置在 nib 中,或者我通过编码创建了我的表格视图。

正如马特的回答,它们是一样的。你可以选择一种方式让你快乐。 快乐的编码,兄弟/。

【讨论】:

【参考方案3】:

我同意 Matt 和 Quang 的回答,但有时我们需要在其他 ViewController 类中重用相同的 tableview 及其委托和数据源,此时与数据源和委托的出口连接可能不起作用,这意味着您的委托方法可能不会被称为。

示例 -

我有一个带有 tableview 的 ViewController(A 类)。我需要将此控制器的整个视图重用于另一个类(B 类)

A.view.addSubview(B.view)

所以在这种情况下你必须要写下面的代码

Class A:UIViewController, UITableViewDataSource, UITableViewDelegate


@IBOutlet weak var tableView: UITableView!


override func viewDidLoad() 
      super.viewDidLoad()
      self.tableView.delegate = self
      self.tableView.datasource = self 
   


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



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

【讨论】:

以上是关于self.tableView.delegate = 自我斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

从 xib 错误加载表格视图中的单元格

UITableView 在滚动时崩溃

为啥某个协议在没有实现它的类的情况下工作?