2017-08-28 26 views
0

問題是UITableView.dataSource適用於擴展,但不適用於代表。 我創建了新的項目,並在故事板中添加了一個UITableViewSwift - UITableView不能與代表一起使用

下面是使用擴展代碼:

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.dataSource = self 
//  tableView.dataSource = Delegate() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

extension ViewController: UITableViewDataSource { 
//class Delegate: NSObject, UITableViewDataSource { 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     print(1) // called several times 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     print(2) // called 

     var cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell") 
     if cell == nil { 
      cell = UITableViewCell(style: .default, reuseIdentifier: "UITableViewCell") 
     } 
     return cell! 
    } 
} 

使用委託:

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
//  tableView.dataSource = self 
     tableView.dataSource = Delegate() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

//extension ViewController: UITableViewDataSource { 
class Delegate: NSObject, UITableViewDataSource { 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     print(1) // called several times 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     print(2) // doesn't called 

     var cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell") 
     if cell == nil { 
      cell = UITableViewCell(style: .default, reuseIdentifier: "UITableViewCell") 
     } 
     return cell! 
    } 
} 

有沒有人遇到過這樣的問題嗎?

+0

您的'cellForRowAt'沒有被調用?檢查你的tableview的高度 –

+0

numberOfRowsInSection被調用,或者你沒有提到/ /多次調用 –

+0

@MikeAlter答案已經在下面給出 –

回答

2

您需要將您的Delegate對象存儲在您的視圖控制器中。原因是dataSource變量UITableView是一個weak變量(以防止保留週期) - 這意味着如果它沒有存儲在strong變量的某處,它將立即被釋放。

tableView.dataSource = Delegate() 

在這裏,您將新實例Delegate分配給弱變量和其他地方。做這樣的事情

class ViewController: UIViewController { 
    var delegate = Delegate() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.dataSource = self.delegate 
} 
+0

現在感覺很愚蠢。謝謝。 –

1

dataSourcedelegate都是weak。因此,您的Delegate()沒有強引用的對象將在viewDidLoad()之後發佈。

如果你想使用這種方式委託,只需var delegate: Delegate!在你的ViewController。然後在viewDidLoad()

self.delegate = Delegate() 
tableView.delegate = self.delegate 
相關問題