2017-01-04 5 views
0

В моем VC есть один UITableView и один UIlabel. Поскольку я сделал все по коду, и в Storyboard ничего нет.UITableView Делегат не называется

Выпуск:

  1. Если я не перезагружать UITable то не любой UITableViewDataSource and UITableViewDelegate называется.

  2. Если я перезаряжаю UITable, как я это сделал в моем нижнем коде, то cellForRow не вызывается.

Я сделал ниже код работа.

import UIKit 


protocol DataVCProtocol 
{ 
    func addNewVC(Index : Int) 
} 


class DataVC: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var delegate:DataVCProtocol? 

    var tblData : UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 

    } 

    override func viewDidAppear(_ animated: Bool) { 

     super.viewDidAppear(true) 

     self.view.backgroundColor = UIColor.clear 
     self.tblData = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width - 20 , height: UIScreen.main.bounds.size.height), style: UITableViewStyle.plain) 
     self.tblData.delegate = self 
     self.tblData.dataSource = self 
     self.tblData.register(TblDataCell.self, forCellReuseIdentifier: "dataCell") 

     self.tblData.showsHorizontalScrollIndicator = false 
     self.tblData.showsVerticalScrollIndicator = false 
     self.view.addSubview(self.tblData) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK:- TableView Datasource 
    // MARK:- 

    public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{ 
     return 60 
    } 

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

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
     let dataCell : TblDataCell = tableView.dequeueReusableCell(withIdentifier: "dataCell") as! TblDataCell 

     dataCell.lblDataText.text = String("data cell #\(indexPath.row)") 

     return dataCell 
    } 

    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ 

     delegate?.addNewVC(Index: indexPath.row) 
    } 


} 

увидеть правую ячейку

enter image description here

+10

Вы забыли добавить '' 'tableView''' в качестве подсмотра к представлению контроллера. – danypata

+0

Удалите ключевое слово «public», затем попробуйте. –

+0

@ danypata nice catch –

ответ

5

Я вывешу общий ответ на вашу проблему, что я думаю, что многие разработчики будет иметь, когда они начинают работать на прошивке и быть честным, я имел это способом более раз что я должен был бы:

Так что всякий раз, когда методы делегата не вызываются для UITableView или UICollectionView, обычно для этого есть 3 основные причины.

1.Наиболее распространенный, делегат не установлен, поэтому его нет, в этом случае на делегат не будет вызван метод (очевидно).

2.The numberOfRowsInSection возвращает 0 или numberOfSections возвращает 0, в этом случае эти методы будут вызываться, но никакие другие методы не будут вызваны, это хороший способ отладить проблему.

3.The tableView или коллекцияView не добавляются в качестве подчиненного основного контроллера, это происходит, когда разработчики предпочитают код вместо раскадровки или xib. В этом случае делегат установлен (не ноль), но не вызван метод из делегата, другой совет для этого - вы не видите разделители по умолчанию для представления таблицы.

-2

вы должны Alloc памяти Tableview.

Просьба сделать ремень вещь.

var tblMenu: UITableView = UITableView() 

tblMenu.frame   = CGRectMake(0, 50, 320, 200);  tblMenu.delegate  = self 
tblMenu.dataSource = self 
tblMenu.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 

Вы пропустили эту часть

self.view.addSubview(tblMenu) 
+0

Он «инициализирует табличное представление в методе' '' viewDidLoad'''. – danypata